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

Apache предоставляет модуль mod_rewrite, который позволяет конвертировать 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 очень удобно, особенно если один сервер обслуживает сразу несколько сайтов. Правила этого файла вступают в силу без перезагрузки сервера. Для редактирования .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
AllowOverride All
Require all granted
</Directory>
. . .
</VirtualHost>

Сохраните и закройте файл. Проверьте ошибки:

sudo apache2ctl configtest

Если ошибок в файле нет, перезапустите 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 – реальный путь к файлу, который обслуживает Apache.
  • 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 очень простое, оно перенаправляет все такие запросы в root-каталог сайта.

Заключение

mod_rewrite –очень полезный и производительный модуль Apache, который позволяет настраивать «чистые» ссылки. Теперь вы знаете, как перенаправлять URL-адреса с помощью RewriteRule и как использовать директиву RewriteCond для определения условий редиректа.

Читайте также:

Tags: , , , ,