Вступление
В этом руководстве мы активируем и узнаем, как управлять перезаписью 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.