Как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 20.04
Основным функциональным модулем для Apache, который позволяет переписывать URL-запросы в удобные для кода строки, является mod_rewrite. Настройка модуля осуществляется набором правил, который описан либо в конфигурации вашего сервера, либо в файлах .htaccess. Далее о том, как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 20.04.
Основным файлом, на ряду с модулем mod_rewrite, который позволяет осуществлять перезаписи запросов, изменять доступ к страницам и многое другое, в соответствии с заданными правилами, является .htaccess.
Этот файл необходимо размещать в корневом каталоге сайта, чтобы он мог функционировать с заданными для него свойствами.
В этой статье, мы отразим необходимую информацию, в которой рассмотрим основные моменты работы модуля mod_rewrite и .htaccess.
Запуск модуля mod_rewrite.
Как правило, модуль mod_rewrite уже установлен в системе, и для дальнейшего его использования веб-сервером Apache, нам нужно только запустить его. Для включения модуля воспользуемся командой a2enmod:
Если на данном этапе модуль был ранее запущен, система сообщит нам об этом. Чтобы веб-сервер Apache полноценно смог работать с модулем mod_rewrite, необходимо перезапустить его. Делается это следующей командой:
$ sudo systemctl restart apache2
Модуль включен. Далее нам необходимо создать файл .htaccess в корневом каталоге нашего сайта, в котором в последующем мы разместим необходимые нам правила.
Создание файла .htaccess
Как говорилось выше, этот файл позволит нам создавать необходимые правила, связанные с работой на нашем будущем сайте.
Предварительно внесем несколько изменений в конфигурацию нашего сервера. Это необходимо сделать для того, чтобы веб-сервер Apache смог работать с файлом .htaccess. Отредактируем следующий файл, например, в редакторе nano.
$ sudo nano /etc/apache2/site-available/000-defaulte.conf
Дополним блок следующими настройками:
Сохраним наши настройки, выйдем из редактора и перезапустим сервер Apache:
$ sudo systemctl restart apache2
Теперь нужно создать файл .htaccess:
$ sudo nano /var/www/html/.htaccess
Первым нашим правилом, которое мы должны добавить в файл .htaccess для активации RewriteEngine , будем следующая строка:
Здесь необходимо сохранить и выйти из редактирования файла.
Настройка перезаписи URL-адресов
После успешного создания файла .htaccess, будем постепенно наполнять его необходимыми правилами, которые будут преобразовывать ссылки в действующие пути к страницам.
Для настройки доступа к ссылке http://your_web_server_ip/index необходимо создать страницу index.html в корневой директории веб-сервера:
$ sudo nano /var/www/html/index.html
Наполнить index.html файл следующим HTML-кодом:
*** Your page content ***
Наша страница будет доступна по следующей ссылке: http://your_web_server_ip/index.html
Но если ввести ссылку ниже: http://your_web_server_ip/index мы получим ошибку 404 .
Как видно из этого примера, в конце ссылки не используется .html , что и привело к появлению ошибки 404 . Ошибка 404 или Not Found («не найдено»)— стандартный код ответа HTTP о том, что клиент был в состоянии общаться с сервером, но сервер не может найти данные согласно запросу. Т.е. запрашиваемая страница отсутствует по данному запросу.
Если мы хотим, чтобы пользователи могли получить доступ к странице, не указывая расширения .html , мы создадим правила перезаписи.
Все правила перезаписи RewriteRules имеют следующий формат:
RewriteRule pattern substitution [flags]
- RewriteRule – опция перезаписи.
- pattern – выражение, определяющее необходимую строку в URL.
- substitution – путь к файлу.
- flags – параметры, управляющие поведением правила.
Теперь отредактируем файл .htaccess:
$ sudo nano /var/www/html/.htaccess
Здесь у нас уже имеется одно правило. Наполним следующим правилом и затем сохраним наши изменения:
RewriteEngine on RewriteRule ^index$ index.html [NC]
В нашем случае ^index$ — это шаблон, index.html – путь к файлу, а [NC] – флаг. Теперь, более подробно про правило, которое мы использовали, по частям:
- ^ – запись, обозначающая начало шаблона URL (после your_web_server_ip/ ).
- $ — конец шаблона.
- Index – сам шаблон, именно то слово, которое необходимо найти в запросе.
- index.html – страница сайта.
- [NC] – флаг, отключающий чувствительность к регистру.
Откроем ссылку http://your_web_server_ip/index в нашем браузере и мы увидим наше правило в работе. Это правило позволят осуществлять доступ к нашей странице index.html по следующим URL-ссылкам:
- http://your_web_server_ip/index; (без .html)
- http://your_web_server_ip/Index; (правило не чувствительно к регистру);
- http://your_web_server_ip/index.html; (ссылка будет работать).
URL-адреса, указанные ниже, работать не будут:
- http://your_web_server_ip/index/ (в нашем правиле (символ $), после index ничего быть не может).
- http://your_web_server_ip/about (так как about не совпадает со строкой index).
В данных примерах мы увидели, каким образом работает правило перезаписи ссылок и для чего необходим файл .htaccess , и узнали, как переписать URL-адреса при помощи mod_rewrite для Apache в Ubuntu 20.04.
Как включить Apache mod rewrite
По умолчанию, когда вы в браузере вводите определённый URL и нажимаете Enter, веб-сервер, получивший этот запрос пытается найти файл на сервере по пути, указанному в URL. Если там ничего не указано, то открывается индексный файл, например index.html или index.php. Если же ничего не найдено — возвращается ошибка 404.
Если бы всё работало всегда именно так, то не было бы красивых и удобных для восприятия URL, которые используются на многих сайтах и в том числе и на этом. Для решения этой проблемы применяется модуль apache mod rewite. В этой статье мы рассмотрим как его включить и как он работает.
Как включить Apache mod rewrite
Если бы всё работало как описано выше, то при открытии ссылки https://losst.pro/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 systemctl restart apache
Но то, что модуль включён на уровне веб-сервера Apache ещё не означает, что он будет работать для веб-сайта. Для этого его надо настроить в файле .htaccess, указать на какому скрипту передавать запросы к несуществующим страницам. Для того чтобы файл .htaccess работал, в секцию Directory виртуального хоста надо добавить директиву AllowOwerride: All. Например:
Далее, например, в WordPress надо добавить такие строки в файл .htaccess:
Весь код заключён в директиву IfModule она позволяет выполнять код внутри неё только когда модуль mod_rewrite включён, иначе эти строки просто игнорируются. Директива RewriteEngine On включает работу этого модуля для текущего каталога. Далее, с помощью RewriteBase / указывается, что необходимо передавать скрипту всю строку после домена. Дальше идут правила RwriteRule с условиями для них RewriteCond, которые выполняются последовательно, сверху вниз.
Первое правило RewriteRule ^index\.php$ — [L] дословно сообщает, что если в URL содержится строка index.php, то надо переписать URL на /. Это простое регулярное выражение в котором указано начало и конец строки, а точка экранирована обратным слешем. Флаг [L] означает только то, что если URL совпала с этим правилом, то следующие правила проверять не стоит. После выполнения этого правила URL перепишется и веб-сервер будет считать, что получил запрос /, анализ правил начнётся сначала и на этот раз совпадёт с последним правилом.
Условия RewriteCond действуют на те правила, что идут сразу за ними. В данном случае — RewriteCond % !-f и RewriteCond % !-d позволяют последнему правилу выполнится только если URL — это не файл и не папка. А последнее правило, как вы уже поняли перенаправляет всё на скрипт ./index.php.
Если у вас что-то не получается в настройке mod_rewrite имеет смысл посмотреть что происходит внутри веб-сервера во время ваших редиректов. Для этого в конфигурацию виртуального хоста сайта, надо добавить такую строчку. Нарпимер:
sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Далее в лог файле, указанному в директиве ErrorLog вы увидите все попытки веб-сервера преобразовать URL по вашим правилам и сможете понять что вы делаете не так.
Выводы
В этой небольшой статье мы рассмотрели как включить mod rewrite Apache, а также как всё это работает и как искать ошибки. А что вы ещё хотели бы добавить в эту статью? Напишите в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.