Перезапись URL-адресов на Apache в Ubuntu 18.04

Модуль mod_rewrite от Apache позволяет конвертировать URL-адреса. Он также позволяет переписывать URL-адреса согласно условиям.

Файл .htaccess позволяет создавать и применять правила перезаписи без необходимости менять конфигурации сервера. Поместив файл .htaccess в корневой каталог веб-сайта, вы можете управлять перезаписью адресов для каждого сайта или каталога.

Этот мануал поможет вам включить модуль mod_rewrite и использовать  файлы .htaccess для настройки базовых редиректов.

Требования

1: Включение mod_rewrite

Чтобы Apache понимал правила перезаписи, сначала нужно активировать mod_rewrite. Он уже установлен, но отключен в установке Apache по умолчанию. Используйте команду a2enmod для включения модуля:

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: , , , ,

Добавить комментарий