Site icon 8HOST.COM

Перезапись 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]

Где:

Читайте также: Введение в регулярные выражения

Откройте .htaccess:

sudo nano /var/www/html/.htaccess

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

RewriteEngine on
RewriteRule ^about$ about.html [NC]

В данном случае ^about$ – это шаблон, about.html – путь к файлу, а [NC] – флаг. Рассмотрим это правило подробнее:

Теперь откройте ссылку http://your_server_ip/about в браузере. Добавленное в .htaccess правило позволяет получить доступ к странице по следующим URL-адресам:

А эти URL-адреса работать не будут:

Теперь у вас есть простой файл .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 истинно, следующее за условием правило RewriteRule будет выполнено. Если условие RewriteCond ложно, правило будет сброшено. Вы можете использовать целые комплексы условий RewriteCond.

Предположим, вы хотите перенаправить запросы к несуществующим страницам на домашнюю страницу сайта, чтобы пользователи не получали ошибки 404 Not Found. Для этого можно использовать:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

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

Заключение

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

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