- Настройка mod_rewrite
- Требования
- 1: Включение mod_rewrite
- 2: Что такое .htaccess?
- Включение файла .htaccess
- 3: Переписывание URL-адресов
- Примеры перезаписи URL-адреса
- Пример 1: открываете страницу А – попадаете на страницу Б
- This page is about Apples
- Пример 2: Параметр как подкаталог в URL-адресе
- Пример 3: Настройка чистых ссылок
- Как включить Apache mod rewrite
- Как включить Apache mod rewrite
- Выводы
Настройка mod_rewrite
Вспомните последнее посещение интернет-магазина. Найдя нужный товар, вы, вероятно, увидели примерно такой URL:
Это происходит не потому, что разработчики этого сайта потратили уйму времени, чтобы настроить отдельные директории для разных категорий товара, а благодаря удобному модулю по имени mod_rewrite. Данный модуль позволяет создавать пользовательские и упрощенные URL-адреса. На самом деле URL выглядит примерно так:
Данное руководство охватывает активацию данного модуля, создание и использование страницы .htaccess, а также настройку переписывания URL-адресов.
Требования
Для выполнения данного руководства понадобятся привилегии root (чтобы получить более подробную информацию, читайте статью «Начальная настройка сервера Ubuntu»).
Кроме того, нужно предварительно установить apache. Для быстрой установки этого веб-сервера в Ubuntu используйте команду:
sudo apt-get install apache2
1: Включение mod_rewrite
Для начала нужно включить mod_rewrite, это очень просто:
Данная команда включит модуль или же выведет сообщение «Module rewrite already enabled» в случае если модуль уже включен.
2: Что такое .htaccess?
Как только модуль был активирован, можно настроить перезапись ссылок путем создания файла .htaccess в каталоге сайта.
Файл .htaccess – это способ тонкой настройки сайта без необходимости изменять файлы конфигурации сервера. Точка, с которой начинается имя файла, значит, что этот файл является скрытым.
Кроме того, важную роль играет размещение файла .htaccess, поскольку настройки этого файла будут влиять на все файлы и подкаталоги каталога, в котором он находится.
Создать файл .htaccess можно при помощи текстового редактора, а затем выгрузить его на сайт при помощи ftp-клиента.
Обратите внимание: файл должен называться именно .htaccess; имя файла не должно содержать дополнительных расширений.
В качестве альтернативы можно создать файл .htaccess через терминал при помощи этой команды, заменив example.com доменным именем сайта.
sudo nano /var/www/example.com/.htaccess
Включение файла .htaccess
Чтобы разрешить файлу .htaccess переопределять стандартные настройки сайта, откройте конфигурационный файл.
Примечание: для этого понадобятся расширенные привилегии sudo.
sudo nano /etc/apache2/sites-available/default
В этом файле найдите следующий раздел и измените значение строки AllowOverride (замените None на All). В результате раздел будет иметь такой вид:
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Сохранив изменения и закрыв файл, перезапустите сервер apache. Теперь файлы .htacess доступны всем сайтам сервера.
sudo service apache2 restart
Теперь все готово для переписывания URL-адресов сайта.
3: Переписывание URL-адресов
Вся операция переписывания URL происходит в файле .htaccess. В целом, все команды перезаписи URL-адреса следовать той же схеме:
RewriteRule Pattern Substitution [OptionalFlags]
Опции, использованные в данной команде:
- RewriteRule: Это раздел, в котором можно задать нужные директивы.
- Pattern: этот раздел предназначен для интерпретации нужного URL-адреса с помощью регулярных выражений. Это руководство не охватывает регулярные выражения; некоторую полезную информацию по этому вопросу можно найти на сайте Apache.
- Substitution: отображает фактический URL страницы. Такую ссылку трудно запомнить, поскольку она состоит из параметров PHP или длинных последовательностей цифр, например: www.bestshop.com/gadgets.php?innovation=laptops
- Optional Flags: флаг представляет собой тег в конце директивы RewriteRule, способный изменить поведение выражения. Некоторые общие флаги: [F] запрещает URL, [NC] игнорирует заглавные буквы, [R = 301] или [R = 302] контролируют используемый код переадресации, [L] говорит о том, что это последнее правило в серии.
Примеры перезаписи URL-адреса
Пример 1: открываете страницу А – попадаете на страницу Б
Это наиболее простой пример перезаписи URL: посетитель сайта вводит в браузер один URL, но перенаправляется на другой. Чтобы настроить такое поведение, следуйте инструкциям этого раздела.
Для начала создайте две страницы сайта; например, первая о яблоках (apples.html), а вторая – об апельсинах (oranges.html).
This page is about Apples
Затем создайте вторую страницу (в данном случае, страницу, посвященную апельсинам). Для этого просто замените Apples в этом блоке кода на Oranges.
Затем откройте файл .htaccess:
sudo nano /var/www/example.com/.htaccess
Внесите в него следующие команды перезаписи URL:
RewriteEngine on
RewriteRule ^oranges.html$ apples.html
Сохраните и закройте файл.
Затем посетите страницу /oranges.html, она будет содержать информацию страницы /apples.html.
Рассмотрим вышеприведенную команду подробнее:
- ^oranges.html: указывает, как начинается нужная страница. Каре (^) указывает на начало строки. Другими словами, если бы страница, URL которой нужно переписать, начиналась иначе (например, не oranges.html, а oranges_1.html), она не совпала бы с правилом перезаписи (rewrite rule) и не была бы перенаправлена на страницу birds.html.
- $: символ доллара ставится в конце URL-адреса. Опять же, если строка заканчивается иначе (например, содержит какие-либо символы после заявленных последних символов), веб-страница не будет распознана правилом перезаписи.
- apples.html: на эту страницу браузер направляет трафик.
Пример 2: Параметр как подкаталог в URL-адресе
Он будет гораздо понятнее отображаться как:
Для этого нужно внести в .htaccess следующие строки:
RewriteEngine on
RewriteRule ^products/([A-Za-z0-9-]+)/?$ results.php?products=$1 [NC]
Эти строки состоят из следующих опций:
- ^products: в данном случае чтобы быть перенаправленным, URL должен начинаться со слова products (имейте в виду, что это относится только к тексту после домена). Опять же, если URL начинается иначе, правило не будет применяться.
- ([A-Za-z0-9-]+): этот взятый в скобки текст указывает, что URL может состоять из любых символов. Знак плюс указывает, что находиться в скобках может один или несколько символов.
- /?$: символ доллара обозначает конец строки. Вопросительный знак позволяет ставить в конце строки косую черту (хотя это необязательно).
- [NC]: это флаг в конце фразы, указывающий, что правило должно игнорировать регистры всех символов.
Пример 3: Настройка чистых ссылок
Эта функция незаменима в том случае, если URL-адреса сайта слишком длинные или сложные.
В качестве примера можно взять такой URL-адрес:
Эта ссылка открывает нужную информацию, но посетитель не сможет быстро запомнить ее при необходимости. Перезапись URL позволяет преобразовать ссылку в более простую и запоминающуюся:
Для этого нужно внести в .htaccess следующие строки (к слову, .htaccess может содержать неограниченное количество таких разделов):
RewriteEngine on
RewriteRule ^(meat|produce|dairy)/([^/.]+)/([^/.]+)$ results.php?products=$1&type=$2&species=$3
Рассмотрим этот код подробнее:
- Каре (символ ^) указывает на начало выражения.
- (meat|produce|dairy): чтобы ограничить параметры, которые можно отображать, укажите в скобках только разрешенные значения (в этом случае это meat, produce и dairy). Если URL содержит параметр, не внесенный в скобки, перезапись не будет выполнена.
- ([^/.]+) показывает, что все, кроме символов после символа вставки (в данном случае, косой черты и точки), может быть написано через косую.
- results.php?products=$1&type=$2&species=$3: каждое значение в круглых скобках будет извлечено и затем вставлено в более длинный URL в части substitution. $1 обозначает первые скобки, $2 – вторые, $3 – соответственно, третьи.
Продолжение статьи можно найти по данной ссылке.
Как включить 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.