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

Модуль 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 очень удобно, особенно если один сервер обслуживает сразу несколько сайтов. Этот файл не требует перезагрузки сервера, чтобы изменения вступили в силу, а для его редактирования не нужны привилегии суперпользователя, что упрощает техническое обслуживание и изменение настроек. Некоторые популярные программы с открытым исходным кодом (например, WordPress и Joomla) часто используют файл .htaccess.

Прежде чем приступить к работе над .htaccess, нужно добавить несколько параметров в настройки сервера.

По умолчанию Apache не поддерживает .htaccess. Чтобы изменить это, откройте конфигурационный файл в текстовом редакторе (например, в 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>

Сохраните и закройте файл. Перезапустите 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

После первой строки добавьте следующее правило, а затем сохраните файл:

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 . / [R=301]

  • %{REQUEST_FILENAME} – это строка, которую нужно проверить. В данном случае это имя запрашиваемого файла, которое является переменной системы, доступной для каждого запроса.
  • -f – встроенное условие, которое проверяет, существует ли запрашиваемый файл. Восклицательный знак (!) – это оператор отрицания. В совокупности ! -f оценивается как истина, только если запрашиваемое имя не существует или не относится к файлу.
  • Аналогично, !-d оценивается как истина, только если запрашиваемое имя не существует или не относится к каталогу.

Правило RewriteRule в последней строке будет выполнено только тогда, когда запрос отправлен к несуществующему файлу или каталогу. Само правило RewriteRule очень простое, оно перенаправляет все такие запросы в корневой каталог сайта.

Кроме того, флаг [R=301] будет возвращать пользователю код ответа HTTP 301 Moved Permanently, в результате чего браузер сможет узнать о перенаправлении и извлечь корневой каталог веб-сайта вместо запрошенного URL-адреса (и при этом изменение адреса отражается в адресной строке).

Без этого флага Apache вернет содержимое корневого каталога, но браузер все равно будет думать, что запрашиваемый URL-адрес существует, и потому будет отображать в адресной строке первоначально запрошенный несуществующий адрес.

Заключение

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

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

Tags: , , , ,

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