Модуль mod_rewrite: как включить, проверка, синтаксис регулярных выражений, примеры использования
3 месяца назад

Модуль mod_rewrite: как включить, проверка, синтаксис регулярных выражений, примеры использования

mod_rewrite - встроенный модуль в apache сервер, который отвечает за преобразование URL-адресов. mod_rewrite работает с полным URL-адресом, включая раздел информации о пути. Правила, по которым httpd сервер определяет работу модуля хранятся в  httpd.conf или в .htaccess, чаще всего пользователь создает у себя на веб-сервере в корневом каталоге файл .htaccess, где и прописываются все преобразования URL-адреса. По умолчанию модуль mod_rewrite отключен настройками веб-сервера.

mod_rewrite включить

На ОС Windows открываем файл
C:\AppServ\Apache24\conf\httpd.conf

Находим строку
#LoadModule rewrite_module modules/mod_rewrite.so

Меняем на (удаляем символ #)
LoadModule rewrite_module modules/mod_rewrite.so

Находим:
<Directory "C:/AppServ/www">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Меняем на
<Directory "C:/AppServ/www">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Перезапускаем apache или ПК.

mod_rewrite проверка включен или нет

В корневой папке создайте файл phpinfo.php
<?php
phpinfo();
?>
mod_rewrite проверка включен или нет
Запустите указанный файл через веб-сервер. Найдите строку Loaded Modules и убедитесь что mod_rewrite присутствует в списки загруженных модулей.

Синтаксис регулярных выражений: набор флагов, директив, переменных, используемых mod_rewrite

Метасимволы mod_rewrite

^ Символ ^ обозначает начало строки.
$ Символ $ обозначает конец строки.
\ Символ \ ставится перед спецсимволами. Следующий символ после него считается обычным текстом.
! Символ отрицания.
. Символ обозначает любой символ (кроме символа конца строки).
.* Заменяет абсолютно любой набор символов.
".*" Найдет все подстроки между кавычками.
| Символ обозначает альтернативу. Например, выражения "A|B" означает "A или B".
(...) Круглые скобки () используются для выделения групп символов.
[...] Квадратные скобки используются для перечисления допустимых символов. Например, выражение "[abc]" равносильно выражению "a|b|c", но вариант с квадратными скобками обычно является более оптимальным по быстродействию. Внутри скобок можно использовать диапазоны: например, выражение "[0-9]" равносильно выражению "[0123456789]".
[^...] Инвертированный класс символов. Если символы внутри квадратных скобок начинаются с символа ^, это означает любой символ, кроме перечисленных в скобках. Например, выражение "[^0-9]+" означает строку из любых символов, кроме цифр.
[...]* Например, [abc]* — команда найдёт идущие подряд символы из заданного набора. [^abc]* — с точностью до наоборот.
\d Заменяет любую цифру.
\D Заменяет любой символ, но не цифру.
[0-9] Заменяет любую цифру.
[a-z] Любая буква от a до z (весь латинский набор символов) в нижнем регистре.
[A-Z] Любая буква от A до Z в ВЕРХНЕМ регистре.
[a-zA-Z] Любая буква от a до Z в любом регистре. [a-Z] — то же самое.


Модификаторы mod_rewrite

? Символ повторяется 0 или 1 раз. Символ ? ставится после символа (), который может как присутствовать, так и отсутствовать.
* Повторяется от 0 до 65536 раз.
+ Повторяется от 1 до 65536 раз. Символ + действует аналогично символу * с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз.
{n} Точно n раз.
{n,} От n до 65536 раз включительно.
{n,m} От n до m раз включительно.


Флаги mod_rewrite

R Использование флага [R] вызывает перенаправление HTTP в браузер
F Использование флага [F] запрещает показ, выдает статус Forbidden 403.
P Использование флага [P] приводит к тому, что запрос mod_proxy обрабатывается через прокси-запрос.
L Флаг [L] приводит mod_rewrite к остановке обработки набора правил. В большинстве случаев это означает, что если правило совпадает, дальнейшие правила обрабатываться не будут.
N Флаг [N] заставляет набор правил начинать процесс преобразования заново с самого начала, используя результат набора правил до сих пор в качестве отправной точки.
C Объединяет правила связанные со следующим правилом. То есть, если правило совпадает, то оно обрабатывается как обычно и преобразование переходит к следующему правилу. Однако, если оно не совпадает, то следующее правило и любые другие правила, связанные вместе, пропускаются.
NC Отключает проверку регистра символов при срабатывании правила.
NE noescape – Не экранировать специальные символы в результатах.
QSA Когда замещающий URI содержит строку запроса, по умолчанию существующая строка запроса отбрасывается и заменяется вновь созданной. Использование флага [QSA] приводит к объединению строк запроса.
S Флаг [S] используется для пропуска правил, которые вы не хотите запускать. Синтаксис флага пропуска следующий: [S= N ], где N означает количество пропускаемых правил.
E С помощью флага [E] или [env] вы можете установить значение переменной среды. Обратите внимание, что некоторые переменные среды могут быть установлены после запуска правила, что приведет к удалению того, что вы установили.

Примеры использования регулярных выражений mod_rewrite в .htaccess

Как поменять URL адрес страницы на другое имя без расширения файла .php

#из /page.php
#меняем на /home-page

RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteRule ^home-page$ page.php [NC,L]

Как в URL скрыть расширение файла или изменить на другое

#из /page.php
#меняем на /menu1/menu2/home-page.html
RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteRule ^menu1/menu2/home-page.html$ page.php [NC,L]

Как скрыть в URL адрес файла и директории

#из /page.php
#меняем на /menu1/menu2/home-page
RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteRule ^menu1/menu2/home-page$ page.php [NC,L]

Как убрать index.php в URL адресе

#из http://name.site/index.php
#меняем на: http://name.site/
RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://name.site/ [R=301,L]

Как сделать редирект с расширения index.html на index.php

#из /index.html
#меняем на: /index.php
RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteCond %{REQUEST_URI} ^(.*)\.html [NC]
RewriteRule ^index.html$ %1.php [R=permanent,L]

Как убать www из URL адреса

#из http://www.name.site/index.php
#меняем на: http://name.site/index.php
RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteCond %{HTTP_HOST} ^www\.name\.ru$ [NC]
RewriteRule ^(.*)$ http://name.ru/$1 [R=301,L]

Как удалить / (слеш) в конце URL адреса

#из /group1/
#меняем на: /group1
RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]

Как добавить имя раздела и страницу в URL адрес

#из page.php?tag=name-of-group&page=3
#меняем на: group-name-of-group-page-3
RewriteEngine on

#Задаем используемую кодировку 
AddDefaultCharset UTF-8

RewriteRule ^group-([a-z-]+)-page-([0-9]+)$ page.php?tag=$1&page=$2 [L,NE]
150
Комментарии