
3 месяца назад
Модуль mod_rewrite: как включить, проверка, синтаксис регулярных выражений, примеры использования
mod_rewrite - встроенный модуль в apache сервер, который отвечает за преобразование URL-адресов. mod_rewrite работает с полным URL-адресом, включая раздел информации о пути. Правила, по которым httpd сервер определяет работу модуля хранятся в httpd.conf или в .htaccess, чаще всего пользователь создает у себя на веб-сервере в корневом каталоге файл .htaccess, где и прописываются все преобразования URL-адреса. По умолчанию модуль mod_rewrite отключен настройками веб-сервера.
Находим строку
Меняем на (удаляем символ #)
Находим:
Меняем на
Перезапускаем apache или ПК.
Запустите указанный файл через веб-сервер. Найдите строку Loaded Modules и убедитесь что 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();
?>

Запустите указанный файл через веб-сервер. Найдите строку 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
Комментарии