Вступление
В этом руководстве мы активируем и узнаем, как управлять перезаписью URL-адресов с помощью модуляmod_rewrite
в Apache 2. Этот модуль позволяет нам переписывать URL-адреса более понятным способом, переводя удобочитаемые пути в удобные для кода строки запросов или перенаправляя URL-адреса на основе дополнительных условий.
Это руководство разделено на две части. Первый устанавливает пример веб-сайта и охватывает простой пример переписывания. Вторая часть содержит еще два подробных примера часто используемых правил перезаписи.
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
Один сервер Ubuntu 16.04 сthis initial server setup tutorial, включая пользователя sudo без полномочий root и брандмауэр.
-
Apache 2 установлен на вашем сервере, выполнив шаг 1How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04.
[[step-1 -—- enable-mod_rewrite]] == Шаг 1. Включение mod_rewrite
Во-первых, нам нужно активироватьmod_rewrite
. Он доступен, но не включен при чистой установке Apache 2.
sudo a2enmod rewrite
Это активирует модуль или предупредит вас, что модуль уже включен. Чтобы эти изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
mod_rewrite
теперь полностью включен. На следующем этапе мы создадим файл.htaccess
, который мы будем использовать для определения правил перезаписи для перенаправлений.
[[step-2 -—- setting-up-htaccess]] == Шаг 2 - Настройка .htaccess
Файл.htaccess
позволяет нам изменять наши правила перезаписи без доступа к файлам конфигурации сервера. По этой причине.htaccess
критически важен для безопасности вашего веб-приложения. Точка, предшествующая имени файла, гарантирует, что файл скрыт.
[.Примечание]##
Note: Любые правила, которые вы можете поместить в файл.htaccess
, также можно поместить непосредственно в файлы конфигурации сервера. Фактически,official Apache documentation рекомендует использовать файлы конфигурации сервера вместо.htaccess
, потому что Apache обрабатывает их быстрее.
Однако в этом простом примере повышение производительности будет незначительным. Кроме того, установка правил в.htaccess
удобна, особенно с несколькими веб-сайтами на одном сервере. Он не требует перезапуска сервера, чтобы изменения вступили в силу, и не требует привилегий root для редактирования этих правил, что упрощает обслуживание и делает возможными изменения с использованием непривилегированной учетной записи. Некоторые популярные программы с открытым исходным кодом, такие как Wordpress и Joomla, часто используют файл.htaccess
, чтобы программа могла изменять и создавать дополнительные правила по запросу.
Нам нужно будет настроить и обезопасить еще несколько параметров, прежде чем мы сможем начать.
По умолчанию Apache запрещает использование файла.htaccess
для применения правил перезаписи, поэтому сначала вам нужно разрешить изменения в файле. Откройте файл конфигурации Apache по умолчанию, используяnano
или ваш любимый текстовый редактор.
sudo nano /etc/apache2/sites-available/000-default.conf
Внутри этого файла вы найдете блок<VirtualHost *:80>
, начинающийся с первой строки. Внутри этого блока добавьте следующий новый блок, чтобы ваш файл конфигурации выглядел следующим образом. Убедитесь, что все блоки имеют правильные отступы.
/etc/apache2/sites-available/000-default.conf
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
. . .
Сохраните и закройте файл. Чтобы эти изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
Теперь создайте файл.htaccess
в корневом веб-каталоге.
sudo nano /var/www/html/.htaccess
Добавьте эту строку вверху нового файла, чтобы активировать механизм перезаписи.
/var/www/html/.htaccess
RewriteEngine on
Сохраните файл и выйдите.
Теперь у вас есть рабочий файл.htaccess
, который вы можете использовать для управления правилами маршрутизации вашего веб-приложения. На следующем шаге мы создадим образцы файлов веб-сайта, которые мы будем использовать для демонстрации правил перезаписи.
[[step-3 -—- configuring-url-rewrites]] == Шаг 3 - Настройка перезаписи URL
Здесь мы настроим базовую перезапись URL, которая преобразует красивые URL в реальные пути к коду. В частности, мы разрешим пользователям доступ кhttp://your_server_ip/about
.
Начните с создания файла с именемabout.html
в корневом веб-каталоге.
sudo nano /var/www/html/about.html
Скопируйте следующий HTML-код в файл, затем сохраните и закройте его.
/var/www/html/about.html
About Us
About Us
Вы можете получить доступ к этой странице вhttp://your_server_ip/about.html
, но обратите внимание, что если вы попытаетесь получить доступ кhttp://your_server_ip/about
, вы увидите ошибку404 Not Found. Если вы хотите, чтобы пользователи обращались к странице, используя вместо этого простоabout
, правила перезаписи позволят именно эту функцию.
ВсеRewriteRules
придерживаются следующего формата:
Общая структура RewriteRule
RewriteRule pattern substitution [flags]
-
RewriteRule
указывает директиву. -
pattern
- этоregular expression, который соответствует желаемой строке из URL-адреса, который зритель вводит в браузере. -
substitution
- это путь к фактическому URL-адресу, т.е. Путь к файлу Apache серверов. -
flags
- это необязательные параметры, которые могут изменять работу правила.
Откройте файл.htaccess
.
sudo nano /var/www/html/.htaccess
После первой строки добавьтеRewriteRule
, отмеченные красным, и сохраните файл.
/var/www/html/.htaccess
RewriteEngine on
RewriteRule ^about$ about.html [NC]
В этом случае^about$
- это шаблон,about.html
- это подстановка, а[NC]
- это флаг. В нашем примере используются несколько символов со специальным значением:
-
^
указывает начало URL-адреса послеyour_server_ip/
. -
$
указывает конец URL-адреса. -
about
соответствует строке «о». -
about.html
- это фактический файл, к которому обращается пользователь. -
[NC]
- это флаг, который делает правило нечувствительным к регистру.
Теперь у вас должен быть доступ кhttp://your_server_ip/about
в вашем браузере. Фактически, с показанным выше правилом следующие URL-адреса будут указывать наabout.html
:
-
http://your_server_ip/about
из-за определения правила. -
http://your_server_ip/About
, поскольку в правиле регистр не учитывается. -
http://your_server_ip/about.html
, потому что исходное имя файла всегда будет работать.
Следующего не будет:
-
http://your_server_ip/about/
, потому что правило явно заявляет, что послеabout
не может быть ничего, используя символ$
. -
http://your_server_ip/contact
, потому что он не будет соответствовать строкеabout
в правиле.
Теперь у вас есть рабочий файл.htaccess
с простым правилом, которое вы можете изменить и расширить в соответствии с вашими потребностями. В следующих разделах мы покажем два дополнительных примера часто используемых директив.
[[example-1 -—- simple-query-strings-with-rewriterule]] == Пример 1. Упрощение строк запроса с помощью RewriteRule
Веб-приложения часто используютquery strings, которые добавляются к URL-адресу с помощью вопросительного знака (?
) после адреса. Отдельные параметры разделяются амперсандом (&
). Строки запроса могут использоваться для передачи дополнительных данных между отдельными страницами приложения.
Например, страница результатов поиска, написанная на PHP, может использовать URL-адрес типаhttp://example.com/results.php?item=shirt&season=summer
. В этом примере в воображаемый сценарий приложенияresult.php
передаются два дополнительных параметра:item
со значениемshirt
иseason
со значениемsummer
. Приложение может использовать информацию строки запроса, чтобы построить правильную страницу для посетителя.
Правила перезаписи Apache часто используются для упрощения таких длинных и неприятных ссылок, как приведенные выше, вfriendly URLs, которые легче вводить и интерпретировать визуально. В этом примере мы хотели бы упростить указанную выше ссылку, чтобы она сталаhttp://example.com/shirt/summer
. Значения параметровshirt
иsummer
все еще находятся в адресе, но без строки запроса и имени сценария.
Вот одно правило для реализации этого:
Простая замена
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
shirt/summer
явно соответствует запрошенному адресу, и Apache вместо этого получает указание обслуживатьresults.php?item=shirt&season=summer
.
Флаги[QSA]
обычно используются в правилах перезаписи. Они говорят Apache добавить любую дополнительную строку запроса к обслуживаемому URL-адресу, поэтому, если посетитель вводитhttp://example.com/shirt/summer?page=2
, сервер ответитresults.php?item=shirt&season=summer&page=2
. Без этого дополнительная строка запроса будет отброшена.
В то время как этот метод достигает желаемого эффекта, и название предмета, и сезон жестко закодированы в правиле. Это означает, что правило не будет работать ни для каких других элементов, напримерpants
, или сезонов, напримерwinter
.
Чтобы сделать правило более общим, мы можем использоватьregular expressions для сопоставления частей исходного адреса и использования этих частей в шаблоне подстановки. Измененное правило будет выглядеть следующим образом:
Простая замена
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
Первая группа регулярных выражений в скобках соответствует строке, содержащей буквенно-цифровые символы и числа, напримерshirt
илиpants
, и сохраняет совпавший фрагмент как переменную$1
. Вторая группа регулярного повторного выражения в скобках точно соответствуетsummer
,winter
,fall
илиspring
и аналогичным образом сохраняет совпавший фрагмент как$2
.
Соответствующие фрагменты затем используются в результирующем URL в переменныхitem
иseason
вместо жестко запрограммированных значенийshirt
иsummer
, которые мы использовали ранее.
Вышеупомянутое преобразует, например,http://example.com/pants/summer
вhttp://example.com/results.php?item=pants&season=summer
. Этот пример также является перспективным, позволяя корректно переписать несколько элементов и сезонов, используя одно правило.
[[пример-2 -—- добавление-условий-с-логикой-using-rewriteconds]] == Пример 2 - Добавление условий с логикой с использованием RewriteConds
Правила перезаписи не обязательно всегда оцениваются по одному без каких-либо ограничений. ДирективаRewriteCond
позволяет нам добавлять условия к нашим правилам перезаписи, чтобы контролировать, когда правила будут обрабатываться. ВсеRewriteConds
придерживаются следующего формата:
Общая структура RewriteCond
RewriteCond TestString Condition [Flags]
-
RewriteCond
указывает директивуRewriteCond
. -
TestString
- это строка для проверки. -
Condition
- шаблон или условие для сопоставления. -
Flags
- это необязательные параметры, которые могут изменять условия и правила оценки.
ЕслиRewriteCond
истинно, будет учитываться следующий заRewriteRule
. Если этого не произойдет, правило будет отменено. НесколькоRewriteCond
могут использоваться один за другим, и при поведении по умолчанию все они должны быть истинными, чтобы следующее правило было рассмотрено.
В качестве примера предположим, что вы хотите перенаправить все запросы к несуществующим файлам или каталогам на вашем сайте обратно на главную страницу вместо отображения стандартной страницы ошибок404 Not Found. Это может быть достигнуто с соблюдением следующих правил:
Перенаправить все запросы на несуществующие файлы и каталоги на домашнюю страницу
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /
С вышеупомянутым:
-
%{REQUEST_FILENAME}
- строка для проверки. В данном случае это запрошенное имя файла, которое является системной переменной, доступной для каждого запроса. -
-f
- это встроенное условие, которое проверяет, существует ли запрошенное имя на диске и является ли оно файлом.!
- оператор отрицания. В совокупности!-f
оценивается как истина, только если указанное имя не существует или не является файлом. -
Точно так же
!-d
оценивается как истина, только если указанное имя не существует или не является каталогом.
RewriteRule
в последней строке вступит в силу только для запросов к несуществующим файлам или каталогам. СамRewriteRule
очень прост и перенаправляет каждый запрос в корень веб-сайта/
.
Заключение
mod_rewrite
- полезный модуль Apache, который можно эффективно использовать для обеспечения удобочитаемости URL-адресов. В этом руководстве вы узнали, как использовать директивуRewriteRule
для перенаправления URL-адресов, в том числе со строками запроса. Вы также узнали, как условно перенаправлять URL-адреса с помощью директивыRewriteCond
.
Если вы хотите узнать больше оmod_rewrite
, взгляните наApache’s mod_rewrite Introduction иApache’s official documentation for mod_rewrite.