Как включить Apache mod rewrite

По умолчанию, когда вы в браузере вводите определённый URL и нажимаете Enter, веб-сервер, получивший этот запрос пытается найти файл на сервере по пути, указанному в URL. Если там ничего не указано, то открывается индексный файл, например index.html или index.php. Если же ничего не найдено — возвращается ошибка 404.


Если бы всё работало всегда именно так, то не было бы красивых и удобных для восприятия URL, которые используются на многих сайтах и в том числе и на этом. Для решения этой проблемы применяется модуль apache mod rewite. В этой статье мы рассмотрим как его включить и как он работает.

Как включить Apache mod rewrite

Если бы всё работало как описано выше, то при открытии ссылки https://losst.ru/kak-vklyuchit-apache-mod-rewrite в корневой директории сайта должен был бы существовать файл или скрипт с именем kak-vklyuchit-apache-mod-rewrite. Но это не так. При запросе этой URL веб-сервер действительно пытается найти такой файл, но когда он его не находит, вместо возвращения ошибки 404 передается управление модулю mod_rewrite, который для всех таких URL выполняет скрипт index.php передавая уже ему строку запроса после домена — /kak-vklyuchit-apache-mod-rewrite. А дальше уже PHP на основе этих данных находит и возвращает нужную страницу.

Для включения mod rewrite достаточно выполнить такую команду:

sudo a2enmod rewrite

А затем надо перезапустить веб-сервер:

sudo systemctl restart apache

Но то, что модуль включён на уровне веб-сервера Apache ещё не означает, что он будет работать для веб-сайта. Для этого его надо настроить в файле .htaccess, указать на какому скрипту передавать запросы к несуществующим страницам. Для того чтобы файл .htaccess работал, в секцию Directory виртуального хоста надо добавить директиву AllowOwerride: All. Например:


Далее, например, в WordPress надо добавить такие строки в файл .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Весь код заключён в директиву IfModule она позволяет выполнять код внутри неё только когда модуль mod_rewrite включён, иначе эти строки просто игнорируются. Директива RewriteEngine On включает работу этого модуля для текущего каталога. Далее, с помощью RewriteBase / указывается, что необходимо передавать скрипту всю строку после домена. Дальше идут правила RwriteRule с условиями для них RewriteCond, которые выполняются последовательно, сверху вниз.

Первое правило RewriteRule ^index.php$ — [L] дословно сообщает, что если в URL содержится строка index.php, то надо переписать URL на /. Это простое регулярное выражение в котором указано начало и конец строки, а точка экранирована обратным слешем. Флаг [L] означает только то, что если URL совпала с этим правилом, то следующие правила проверять не стоит. После выполнения этого правила URL перепишется и веб-сервер будет считать, что получил запрос /, анализ правил начнётся сначала и на этот раз совпадёт с последним правилом.

Условия RewriteCond действуют на те правила, что идут сразу за ними. В данном случае — RewriteCond %{REQUEST_FILENAME} !-f и RewriteCond %{REQUEST_FILENAME} !-d позволяют последнему правилу выполнится только если URL — это не файл и не папка. А последнее правило, как вы уже поняли перенаправляет всё на скрипт ./index.php.

Если у вас что-то не получается в настройке mod_rewrite имеет смысл посмотреть что происходит внутри веб-сервера во время ваших редиректов. Для этого в конфигурацию виртуального хоста сайта, надо добавить такую строчку. Нарпимер:

sudo vi /etc/apache2/sites-available/001-texts.conf

LogLevel warn rewrite:trace4

Далее в лог файле, указанному в директиве ErrorLog вы увидите все попытки веб-сервера преобразовать URL по вашим правилам и сможете понять что вы делаете не так.


Выводы

В этой небольшой статье мы рассмотрели как включить mod rewrite Apache, а также как всё это работает и как искать ошибки. А что вы ещё хотели бы добавить в эту статью? Напишите в комментариях!

Источник: https://losst.ru/
Материал распространяется под лицензией CC-BY-SA

EnglishRussian