Перезапись URL-адресов на Apache в Ubuntu 16.04
Ubuntu | Комментировать запись
Данное руководство научит вас перезаписывать URL-адреса и управлять перезаписью на сервере Apache с помощью модуля mod_rewrite. Этот модуль позволяет создавать «чистые ссылки», преобразовывать пути в строки запроса и настраивать редирект.
Руководство состоит из двух частей. Первая часть поможет настроить простой веб-сайт и перезапись адресов. Во второй части вы найдёте примеры часто используемых правил перезаписи.
Требования
- Сервер Ubuntu 16.04.
- Пользователь с доступом к sudo.
- Настроенный брандмауэр (обо всём этом можно прочитать здесь).
- Установленный веб-сервер Apache 2 (смотрите специальный раздел руководства Установка стека LAMP в Ubuntu 16.04)
1: Включение mod_rewrite
Сначала нужно включить модуль mod_rewrite. Он поставляется с Apache 2 по умолчанию, но включать его нужно вручную.
sudo a2enmod rewrite
Эта команда включит модуль. Если модуль был включен ранее, она сообщит вам об этом. Чтобы обновить настройки веб-сервера, перезапустите его:
sudo systemctl restart apache2
Итак, модуль mod_rewrite включен. Теперь нужно подготовить файл .htaccess, в котором будут храниться правила перезаписи и редиректа.
2: Создание файла .htaccess
Файл .htaccess позволяет настраивать редирект вне конфигурационного файла сервера. По этой причине файл .htaccess может подвергнуть риску безопасность веб-приложения. Точка в начале имени значит, что это скрытый файл.
Примечание: Все правила, хранящиеся в .htaccess, будут работать и в конфигурационных файлах сервера. Документация Apache рекомендует использовать обычные конфигурационные файлы вместо .htaccess, поскольку они быстрее обрабатываются веб-сервером.
Однако в этом простом примере увеличение производительности не является главной целью. Кроме того, хранить правила в .htaccess очень удобно, особенно если один сервер обслуживает сразу несколько сайтов. Этот файл не требует перезагрузки сервера, чтобы изменения вступили в силу, а для его редактирования не нужны привилегии суперпользователя, что упрощает техническое обслуживание и внесение изменений в настройки. Некоторые популярные программы с открытым исходным кодом (например, WordPress и Joomla) часто используют файл .htaccess.
Прежде чем приступить к настройке .htaccess, нужно добавить несколько параметров в настройки сервера.
По умолчанию Apache не поддерживает .htaccess. Чтобы изменить это, откройте конфигурационный файл Apache в текстовом редакторе (например, в nano).
sudo nano /etc/apache2/sites-available/000-default.conf
Найдите блок <VirtualHost *:80>. Добавьте в него следующий блок настроек:
<VirtualHost *:80>
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
. . .
</VirtualHost>
Сохраните и закройте файл. Перезапустите Apache:
sudo systemctl restart apache2
Теперь создайте .htaccess в корневом каталоге веб-сервера.
sudo nano /var/www/html/.htaccess
Добавьте следующую строку в начало файла, чтобы включить механизм перезаписи:
RewriteEngine on
Сохраните и закройте файл.
В дальнейшем вы сможете использовать файл .htaccess для хранения правил маршрутизации приложения.
3: Настройка перезаписи URL-адресов
Теперь можно создать базовые правила перезаписи URL-адресов, которые будут преобразовывать чистые ссылки в строчки кода. Рассмотрим настройку на примере ссылки:
http://your_server_ip/about
Для начала создайте страницу about.html в корневом каталоге веб-сервера:
sudo nano /var/www/html/about.html
Скопируйте и вставьте в файл такой HTML-код:
<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>
Страница будет доступна по ссылке:
http://your_server_ip/about.html
Обратите внимание: если вы введёте ссылку:
http://your_server_ip/about
вы получите ошибку 404. Если вы хотите, чтобы пользователи могли получить доступ к странице, не указывая расширения .html, вы можете создать правила перезаписи.
Все правила перезаписи RewriteRules имеют такой формат:
RewriteRule pattern substitution [flags]
Где:
- RewriteRule – директива перезаписи.
- pattern – регулярное выражение, которое определяет необходимую строку в URL-адресе.
- substitution – путь к файлу.
- flags – дополнительные параметры, которые управляют поведением правила.
Откройте .htaccess:
sudo nano /var/www/html/.htaccess
После первой строки добавьте следующее правило RewriteRule , а затем сохраните файл:
RewriteEngine on
RewriteRule ^about$ about.html [NC]
В данном случае ^about$ – это шаблон, about.html – путь к файлу, а [NC] – флаг. Рассмотрим это правило подробнее:
- ^ обозначает начало искомого шаблона URL-а (после your_server_ip/).
- $ – конец искомого шаблона.
- about – собственно шаблон, слово, которое нужно найти в ссылке.
- about.html – путь к файлу этой страницы.
- [NC] – флаг, который отключает чувствительность к регистру.
Теперь откройте ссылку http://your_server_ip/about в браузере. Добавленное в .htaccess правило позволяет получить доступ к странице по следующим URL-адресам:
- http://your_server_ip/about;
- http://your_server_ip/About (поскольку правило нечувствительно к регистру);
- http://your_server_ip/about.html (оригинальная ссылка будет работать всегда).
А эти URL-адреса работать не будут:
- http://your_server_ip/about/ (согласно добавленному правилу (символ $), после about ничего больше быть не может).
- http://your_server_ip/contact (потому что contact не совпадает со строкой about).
Теперь у вас есть простой файл .htaccess, в котором хранится базовое правило перезаписи ссылок. Ниже вы найдёте несколько полезных примеров наиболее часто используемых директив.
Пример 1: Упрощение строки запросов с помощью RewriteRule
Веб-приложения часто используют строки запросов, которые добавляются в URL-адрес при помощи вопросительного знака. Параметры разделяются с помощью амперсанда (&). Строки запроса можно использовать для передачи дополнительных данных между отдельными страницами приложения.
К примеру, страница результатов поиска, написанная в PHP, может использовать такой URL:
http://example.com/results.php?item=shirt&season=summer
В данном примере сценарию result.php были переданы два дополнительных параметра: item со значением shirt и season со значением summer. Приложение может использовать информацию строки запроса, чтобы собрать для посетителя правильную страницу.
Правила перезаписи Apache часто используются для преобразования длинных и сложных URL-адресов в «чистые» ссылки, которые легче запомнить и визуально воспринимать.
Попробуйте преобразовать предыдущую ссылку в более простую:
http://example.com/shirt/summer
Параметры shirt и summer останутся, а строки запроса и имени сценария в ссылке больше не будет.
Для этого можно использовать такое правило:
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
Правило находит в исходном адресе shirt и summer и обслуживает эти параметры вместо строки results.php?item=shirt&season=summer.
Флаги [QSA] часто используются в правилах перезаписи. С их помощью Apache вставляет дополнительные строки запросов в любой URL-адрес. Если пользователь вводит http://example.com/shirt/summer?page=2, сервер использует ссылку results.php?item=shirt&season=summer&page=2.
Без этого флага дополнительная строка запроса будет сбрасываться.
Это правило позволяет достичь желаемого результата, но при этом параметры shirt и summer жестко закодированы в нём. То есть, если в ссылке используютсядругие параметры (например, pants и winter), правило работать не будет.
Чтобы сделать правило более гибким, используйте регулярные выражения. Они могут выполнять поиск по исходному адресу и применять найденные параметры в шаблоне. Правило с регулярным выражением выглядит так:
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
Первое регулярное выражение в скобках будет искать буквенно-цифровые символы; такое выражение найдёт параметр (например, shirt или pants) и сохранит его как переменную $1. Второе выражение будет искать параметры summer, winter, fall или spring и присвоит их переменной $2.
Найденные параметры будут использоваться в ссылке как переменные item и season. Такой подход позволяет избежать жёсткого кодирования параметров.
Предложенное выше правило преобразует, к примеру, http://example.com/pants/summer в http://example.com/results.php?item=pants&season=summer. Правило будет действительно и для других страниц сайта.
Пример 2: Директива RewriteCond и логические условия
Правила перезаписи не всегда считываются по порядку. Директива RewriteCond позволяет добавлять условия, которые управляют обработкой правил.
Все условия RewriteCond пишутся в одном формате:
RewriteCond TestString Condition [Flags]
- RewriteCond – директива.
- TestString – строка, которую нужно проверить.
- Condition – шаблон или условие, которое нужно соблюдать.
- Flags – опциональные параметры, изменяющие поведение правила.
Если условие RewriteCond истинно, следующее за условием правило RewriteRule будет выполнено. Если условие RewriteCond ложно, правило будет сброшено. Вы можете использовать целые комплексы 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 и использовать директиву RewriteCond для определения условий редиректа.
Читайте также:
Tags: .htaccess, Apache, Mod_Rewrite, Ubuntu 16.04