Htaccess синтаксис


Начнем издалека, чтобы и новичкам был понятен принцип работы описываемого в статье файла. Для функционирования сайта в Интернете нужен не только компьютер и выход к сети, но и установленное на него специальное ПО, которое обеспечивает доступ к данным по протоколам http и https. Таким программным обеспечением и является веб-сервер. Существуют различные типы веб-серверов, но самый распространенный — Apache. Он построен на открытом коде, предоставляется бесплатно, постоянно дорабатывается и улучшается, совместим с многими скриптами и работает почти на всех платформах, включая Windows, Linux, Netware 5.x.

Настраивается Apache через конфигурационные файлы, которые хранятся в текстовом формате. С их помощью можно задать определенные правила действия веб-сервера. Главный конфигурационный файл называется httpd.conf или apache.conf (в зависимости от дистрибутива ОС). Во многих случаях все конфигурации сервера можно указывать именно здесь, и в основном такой способ предпочтительней, потому что:


а) уменьшает время ответа веб-сервера при запросе (так при каждом обращении к веб-серверу Apache не будет просматривать все каталоги на наличие .htaccess);
б) некоторые директивы, например директивы модуля mod_rewrite, во многих отношениях работают лучше из главного конфигурационного файла.

Но доступ к этому файлу может быть не у всех пользователей сервера (например, в случае с виртуальным хостингом), поэтому остальным предлагается файл дополнительной конфигурации веб-сервера — .htaccess (c точкой в начале названия).

Содержание

  • 1 Что такое .htaccess и для чего он нужен
  • 2 Как создать файл .htaccess
  • 3 Синтаксис .htaccess
  • 4 Возможности .htaccess
    • 4.1 Контроль доступа
    • 4.2 Работа с ошибками веб-сервера
    • 4.3 Настройка 301 редиректа в htaccess
    • 4.4 Модуль перенаправления mod rewrite
    • 4.5 Определение кодировки
    • 4.6 Другие возможности
  • 5 Если .htaccess не работает
  • 6 И еще несколько советов по работе с .htaccess
  • 7 Полезные ссылки

Что такое .htaccess и для чего он нужен

Файл (или файлы) .htaccess будет задавать правила работы веб-сервера только в каталоге, где он размещен, и его дочерних каталогах, без глобальных изменений работы всего сервера. Возможность использовать .htaccess прописывается директивой (т.е. командой) — AllowOverride — в главном конфигурационном файле httpd.conf, название которой прямо говорит о том, что настройки внутри .htaccess приоритетны перед настройками в httpd.conf (если иное не ограничено все той же директивой AllowOverride). С помощью этой директивы можно позволить все, а можно — только некоторые действия. Детальную инструкцию по его применению можно найти на сайте Apache.


С ней, при каждом обращении к веб-серверу, Apache будет просматривать все каталоги на наличие .htaccess. Изменения в файле действительны сразу после сохранения — перезагрузка всего веб-сервера не нужна (в отличие от изменений в httpd.conf).

Имя файла .htaccess — общепринятое, но вовсе не обязательное. В httpd.conf можно задать другое имя с помощью директивы AccessFileName, например, так:

AccessFileName .config

Как создать файл .htaccess

Как уже говорилось, конфигурационные файлы имеют текстовый формат, и создать .htaccess также можно с помощью текстового редактора (например, Блокнота или NotePad++ в Windows).

Имя файла — .htaccess (с точкой в начале);

тип — “Все файлы”;

формат переноса по словам;

режим ASCII (при загрузке .htaccess на хостинг по FTP-протоколу).

Apache — регистрозависимый веб-сервер, поэтому важно написать название маленькими буквами: .HTaccess и .htaccess — это разные файлы.

В Mac ОS файлы, начинающиеся с точки, невидимы. Поэтому Вы можете назвать его иначе и после, переместив по FTP на хостинг, переименовать. Обычно размещают файл в корневой директории веб-сервера (/public_html) либо в корневой директории сайта (/public_html/site.com/).

Синтаксис .htaccess


Синтаксис .htaccess аналогичен синтаксису httpd. Для каждой директивы предполагается отдельная строка. Для своего же удобства, Вы можете вносить в файл комментарии с помощью знака #, и значение после # будет игнорироваться веб-сервером. Этот трюк можно использовать для отключения любой директивы. Ее не нужно удалять полностью из файла — достаточно просто закомментировать.

Возможности конфигурационного файла огромны. Ниже приведены базовые настройки в .htaccess.

Возможности .htaccess

Контроль доступа

Запрет веб-доступа:

Order Deny,Allow  Deny from all  

Запрет веб-доступа, кроме IP:

order deny,allow  deny from all  allow from xxx.xxx.xxx.xxx  

Запрет веб-доступа для IP:

Order allow,deny  Allow from all  Deny from xxx.xxx.xxx.xxx  

Запрет доступа к файлу:

<Files private.html >  Order allow,deny  Deny from all  

Защита директории с помощью пароля:

AuthType Basic   AuthName "Directory Name"  AuthUserFile /home/cpanel_user/.htpasswds/public_html/smth/passwd  require valid-user    # где AuthName "Directory Name - имя защищенной директории, а   # /home/cpanel_user/.htpasswds/public_html/smth/passwd - местонахождение файла с паролем.  

Работа с ошибками веб-сервера


Иногда вместо ожидаемой страницы посетитель может натолкнуться на ответ веб-сервера в виде ошибки с лаконичным, но не всегда понятным для простого пользователя, объяснением причины. Полный список кодов состояния можно найти в Википедии. Для самых распространенных (например, 404 или 500 ошибки) желательно создать свою страницу, которая лучше смотрится и представляет посетителю пути выхода. Задается она следующим образом:

ErrorDocument 404 http://yourdomain.com/error/404.html  # где http://yourdomain.com/error/404.html - путь к созданной странице.   

P.S. Пользователи услуги хостинг сайта от HOSTiQ.ua могут воспользоваться для создания своей страницы функционалом контрольной панели cPanel (в разделе “Расширенный” пункт “Страницы ошибок”).

Настройка 301 редиректа в htaccess

Для создания постоянного перенаправления используется директива 301 редиректа, которая передает весь вес страницы на новый url (поэтому оно предпочтительней, чем 302 редирект — в целях SEO).

Перенаправление всего сайта на новый домен:

Redirect 301 / http://www.newdomain.com/  

Перенаправление страницы на новую:

Redirect 301 /page1.html http://mydomain.com/page2.html  

Модуль перенаправления mod rewrite

Незаменимым механизмом для изменения URL-ссылок “на лету” является модуль mod_rewrite. Его полезность, а вместе с тем, сложность заключается в том, что можно использовать несметное количество правил, включающих еще больше переменных.


Для работы модуля, прежде всего нужны директивы

RewriteEngine On (включает работу механизма преобразования)

Options FollowSymLinks (условие для работы mod_rewrite).

Если администратор сервера отключил данную опцию для директории пользователя, то невозможно использовать механизм преобразования. Такое ограничение накладывается на серверах виртуального хостинга в целях безопасности.

Для дальнейшего ознакомления с модулем рекомендуем обратиться к первоисточнику.

RewriteRule

Одной из самых функциональных директив модуля mod_rewrite является RewriteRule. Для того, чтобы указать условие, при котором будет работать правило, используется директива RewriteCond. Она (одна или несколько) обязательно прописывается перед RewriteRule.

Перенаправление страницы на новый домен:

RewriteRule ^page1.html$ http://newdomain.com/ [R=301]  

Перенаправление сайта с домена без www на домен с www:

RewriteEngine On  RewriteCond %{HTTP_HOST} !^www..* [NC]  RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301]  

И наоборот:

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

Перенаправление по протоколу HTTPS (предварительно нужно установить сертификат HTTPS):

RewriteEngine On  RewriteCond %{HTTPS} !on  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]   

Эти строки необходимо разместить в самом верху .htaccess.


Определение кодировки

Таблицу символов, в которой следует открыть сайт, определяет браузер. Однако, можно задать кодировку по умолчанию:

AddDefaultCharset UTF-8  

Такое изменение распространяется в пределах действия .htaccess и на все страницы сайта. Можно задать кодировку для определенного типа файла, например windows-1251 для html:

AddType "application/x-httpd-php3; charset=windows-1251" .html  

Часто сама страница несет в себе (а именно в заголовке) информацию об используемой кодировке. Нужно проверить, чтобы указанная кодировка в документе и в конфигурационном файле совпадали. Приведенная здесь utf-8 практически всегда требуется при работе популярных cms, так как они рассчитаны на большой круг пользователей по всему миру. Кстати, по умолчанию эта же кодировка настроена и на наших серверах виртуального хостинга.

Другие возможности

— Определить индексный файл сайта:

По умолчанию, индексной страницей считается index.html. С помощью следующей директивы можно задать другое название файла, который отрывается первым при обращении к каталогу:

DirectoryIndex index.php  

— Полезной директивой является FilesMatch, которая оговаривает пределы действия правила по названию файла, используя регулярные выражения. С ее помощью, например, можно запретить доступ к определенным файлам:


<FilesMatch  ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">  Order Allow,Deny  Deny from all  </FilesMatch>  

Есть некоторые директивы, которые не поддерживаются на наших серверах с виртуальным хостингом, но вы можете их разрешить на своем ВПС, например.

Причина в том, что работающий как suPHP веб-сервер не поддерживает php_flag и php_value. Поэтому, мы предлагаем использовать сPanel (крайне полезен подраздел “Выбор версии РНР”, для работы с error_log — “Журнал ошибок”) или создать локальный файл php.ini для этой цели. Пару директив мы все-таки привели ниже:

— Для того, чтобы избежать зависания веб-сервера при обработке некорректно написанных скриптов, существует max_execution_time. С ее помощью указывается время в секундах, отведенное на обработку РНР-скрипта. Можно увеличить время ожидания веб-сервера при выполнении скрипта:

php_value max_execution_time 60  

— Определить максимальный размер загружаемого файла:

php_value upload_max_filesize 128M (здесь вместо 128 поставьте нужное значение).  

— Вывести ошибки РНР в отдельный файл:

php_flag log_errors on  php_value error_log /home/path/to/public_html/domain/PHP_errors.log  # PHP_errors.log - название файла, а   # /home/path/to/public_html/domain - путь к нему).  

P.S. На виртуальном хостинге трудно с точностью определить, какие директивы будут работать в .htaccess, потому что многие из тех, которые ведут к изменению конфигурации веб-сервера, запрещены по понятным причинам — эти изменения затронут всех пользователей на носителе.

Если .htaccess не работает


Проверить работу файла можно, прописав несложные директивы, которые при правильном синтаксисе и верных настройках httpd (как описывалось в начале статьи) должны сработать:

— например, запретив доступ к сайту извне с помощью директивы

Order deny,allow  Deny from all  

— или записав в файл набор бессмысленных символов, которые не являются директивами. Если веб-сервер взаимодействует с htaccess, то он, конечно, не сможет их прочитать и отдаст 500 ошибку.

Если проблема действительно существует, нужно в первую очередь искать причину в главном конфигурационном файле:

— убедиться, что сервер разрешает использование файла .htaccess: есть запись AllowOverride All (и она не закомментирована с помощью #);

— проверить, что создана запись VirtualHost для домена. В качестве примера:

<VirtualHost *:80>  DocumentRoot /www/example1  ServerName www.example.com  # Другие директивы  </VirtualHost>  

— название файла дополнительной конфигурации указано как Вам нужно. Если это .htaccess, то:

AccessFileName .htaccess  

— присутствует хостнейм сервера (указывается при создании URL-перенаправлений) в виде IP-адреса сервера или домена:

ServerName www.example.com  

Если же причина не в httpd, нужно проверить сам .htaccess на наличие синтаксических ошибок. Можно воспользоваться онлайн-сервисами (например, http://www.htaccesscheck.com/, http://htaccess.madewithlove.be/), или — оригинальным источником, где есть полный перечень директив, вместе с синтаксисом.


И еще несколько советов по работе с .htaccess

Крайне желательно перед любым редактированием делать резервную копию файла — чтобы при худшем исходе можно было “откатить” изменения обратно.

Рекомендуем вносить изменения пошагово, используя минимум директив — и в случае неудачи будет легче вычислить, какое именно правило вызвало ошибку.

Хотя изменения и сразу вступают в силу, кэш браузера никто не отменял — для проверки работы сайта после редактирования .htaccess, регулярно пользуйтесь его очисткой или загружайте страницу в обход кэша — через комбинацию клавиш Ctrl + F5 (в Safari: Ctrl + R, в Mac OS: Cmd + R).

Самая распространенная ошибка веб-сервера при работе с .htaccess — 500, и либо она указывает на проблему в синтаксисе (опечатка в директиве, например), либо же в главном конфигурационном файле не разрешен такой тип директивы.

Полезные ссылки

Лучший источник вдохновения для работы с .htaccess:

http://httpd.apache.org/docs/2.2/howto/htaccess.html


Многие инструкции по работе с .htacess, на русском:

http://htaccess.net.ru/

Простые генераторы директив для .htaccess:

http://htaccess.ru/generator/

http://www.htaccesseditor.com/en.shtml

Если вам недостаточно .htaccess файла для внесения изменений в конфигурацию веб-сервера, возможно аренда выделенного сервера в Европе или США вам подойдет. На выделенных серверах вы можете вносить изменения непосредственно в настройки Apache. Наши предложения на выделенные серверы подойдут для любого пользователя. Если вас также интересует покупка доменных имен, то заказывая хостинговые услуги, вы сможете сразу узнать, сколько стоит домен и хостинг.

Читайте также:

hostiq.ua

Метасимволы

Пример:

RewriteRule ^old(.*)$ /new.php [L,R=301]

Используются для задания групп символов или «меток» в шаблоне. Например, метки начала или конца строки.

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

Дополнение. Все, что расположено после символа ‘#’, считается комментарием.

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

Пример:

RewriteRule (.*) $1? [R=301,L]

Модификаторы используются после обычных, спецсимволов или их групп и позволяют расширить возможности шаблонов для срабатывания правил.

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

Примеры использования:

^stena

Любые строки, начинающиеся со слова stena. Строка, начинающаяся со слова dom-stena не удовлетворит критерию.

stena$

Любые строки, заканчивающиеся набором символов stena. Строка, заканчивающаяся на stena-dom под выбор не попадёт.

.*

Любой символ повторяется любое количество раз. Под критерий попадут все строки.

^(.*)$

Выбрать любую строку и сохранить её как переменную $1 для дальнейшего использования.

[0-9]{1,6}$

Выбрать все строки, оканчивающиеся от 1 до 6 цифами из диапазона от 0 до 9.

^(.+)/(.+)$

Разбить строку на две части: до слэша и после, части строки будут доступны по переменным $1 и $2.

Флаги

Пример:

RewriteRule ^htaccess-fake$ - [G]
RewriteRule (.*) page.php?%1 [L]

Флаги — дополнительные опции. Перечисляются в квадратных скобках через запятую, скажем [NC] или [R=301,L].

R (redirect) останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (302, MOVED TEMPORARY). С данным флагом можно указать другой код результата, например «R=301» возвратит редирект с кодом 301 (MOVED PERMANENTLY).

F (forbidden) возвращает ошибку 403 (FORBIDDEN).
G (gone) возвращает ошибку 410 (GONE).
P (proxy) — по этому флагу Apache выполняет подзапрос (sub-request) к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy не входит в состав вашей сборки Apache, то применение данного флага вызовет ошибку.
L (last) останавливает процесс преобразования, и текущая ссылка считается окончательной.
N (next) запускает процесс преобразования с первого по порядку правила.
C (chain) объединяет несколько правил в цепочку. Если первое правило цепочки «не срабатывает», то вся цепочка игнорируется.
NS (nosubreq) разрешает «срабатывание» правила только для настоящих запросов, игнорируя подзапросы (подзапрос может быть вызван, например, включением файла при помощи директивы SSI).
NC (nocase) отключает проверку регистра символов при срабатывании правила.
QSA (qsappend) добавляет исходные параметры запроса (query string) к замене. Если замена не включает в себя новые параметры запроса, то исходные параметры запроса добавляются автоматически. Если же включает, то без флага QSA исходные параметры запроса будут утеряны.
PT (passthrough) останавливает процесс преобразования и передает полученную новую ссылку дальше «по цепочке», чтобы над ней могли «поработать» директивы Alias, ScriptAlias, Redirect и им подобные (тогда как при флаге L новая ссылка считается окончательной и не подлежит дальнейшей обработке).
S (skip) пропускает следующее правило, если данное правило «сработало». Можно пропускать несколько правил, если указать их количество, например: «S=3».
E (env) устанавливает переменную окружения, например: «E=переменная:значение».

Проверки

Пример:

RewriteEngine on    RewriteCond %{REQUEST_FILENAME} !-d    RewriteCond %{REQUEST_FILENAME}.html -f    RewriteRule ^(.*)$ $1.php

В условиях могут быть использованы следующие проверки:

1. Вы можете предварить шаблон символом ‘!’, чтобы обозначить несоответствие шаблону.

2. Можно выполнить лексикографическое сравнение строк:

Лексикографически меньше
Лексикографически больше
Равенство
Лексикографически меньше или равно
Лексикографически больше или равно

3. Сравнение, как целых чисел:

Численно равно
Численно больше или равно
Численно больше
Численно меньше или равно. Во избежание путаницы с заглавной буквой -l используйте -L
Численно меньше. Во избежание путаницы с заглавной буквой -l используйте -L

4. Тест на различные атрибуты файлов:

Является ли директорией.
Является ли обычным файлом.
Существует ли файл.
Является ли символической ссылкой.
Является ли символической ссылкой. Аналог флага -l.
Является ли обычным файлом ненулевого размера
Существует ли заданный URL
Является ли файл исполняемым.

5. Все эти проверки также могут быть предварены префиксом восклицательный знак (‘!’) для инвертирования их значения.

Переменные

Пример:

RewriteCond %{REQUEST_URI} /+[^.]+$    RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]    
HTTP_USER_AGENT Содержит информацию о типе и версии браузера и операционной системы посетителя.
HTTP_REFERER Приводится адрес страницы, с которой посетитель пришёл на данную страницу.
HTTP_COOKIE Список COOKIE передаваемых браузером
HTTP_FORWARDED Страница непосредственно с которой перешел пользователь
HTTP_HOST Адрес сервера, например host.com
HTTP_ACCEPT Описываются предпочтения клиента относительно типа документа.
REMOTE_ADDR IP-адрес посетителя.
REMOTE_HOST Адрес посетителя в нормальной форме — например, rt99.net.com
REMOTE_IDENT Имя удаленного пользователя. Имеет формат имя.хост, например, kondr.www.rtt99.net.com
REMOTE_USER То-же, что и REMOTE_IDENT, но содержит только имя. Пример: kondr
REQUEST_METHOD Позволяет определить тип запроса (GET или POST). Должен обязательно анализироваться, т.к. определяет дальнейший способ обработки информации
SCRIPT_FILENAME Полный путь к вебстранице на сервере.
PATH_INFO Содержит в себе все, что передавалось в скрипт.
QUERY_STRING Содержит строчку, переданную в качестве запроса при вызове CGI скрипта.
AUTH_TYPE Используется для идентификации пользователя
DOCUMENT_ROOT Cодержит путь к корневой директории сервера.
SERVER_ADMIN Почтовый адрес владельца сервера, указанный при установке.
SERVER_NAME Адрес сервера, типа kondr.host.com
SERVER_ADDR IP-адрес вашего сайта.
SERVER_PORT Порт на котором работает Apache.
 SERVER_PROTOCOL  Версия HTTP протокола.
 SERVER_SOFTWARE  Название сервера, например, Apache/1.3.2 (Unix)
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
Переменные предназначены для работы со временем в разных форматах.
API_VERSION Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h.
THE_REQUEST Полная строка HTTP запроса отправленная браузером серверу (т.е., «GET /index.html HTTP/1.1»). Она не включает какие-либо дополнительные заголовки отправляемые браузером.
REQUEST_URI Ресурс, запрошенный в строке HTTP запроса.
REQUEST_FILENAME Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.
IS_SUBREQ Будет содержать текст «true» если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированы модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи.

Логика исполнения правила (RewriteRule)

Исполнение же правила подразумевает следующие действия: первым делом механизм преобразования выполняет поиск дополнительных условий для этого правила (RewriteCond директивы). Помним, что по историческим причинам дополнительные условия находятся перед правилами(RewriteRule). Если дополнительные условия для этого правила отсутствуют, то механизм преобразований тупо выполняет указанное в правиле преобразование текущего URL и переходит к следующему правилу. Однако если для исполняемого правила (RewriteRule) существуют дополнительные условия, указанные ПЕРЕД НИМ в директивах RewriteCond, то запускается внутренний цикл для обработки этих дополнительных условий в том порядке, в котором они перечислены, сверху вниз.

Если из имеющихся для правила дополнительных условий хотя бы одно условие НЕ выполняется это приводит к остановке запущенного процесса исполнения правила, и преобразование над URL, заданное в правиле, НЕ выполняется. Что бы запущенное на исполнение правило выполнилось до конца и изменило URL, необходимо, что бы выполнились ВСЕ дополнительные условия, указанные в директивах RewriteCond перед этим правилом!

Тут нужно дополнительно пояснить, что директивы RewriteCond по умолчанию объединены между собой оператором AND в одно составное условие. Просто этот оператор(AND) не записывается по умолчанию. От сюда и такая логика, что нужно, что бы все дополнительные условия были истинными (т.к. они объедены через AND) для удачного завершения преобразования URL. Однако директивы RewriteCond можно объединить условием OR при помощи флагов (см. синтаксис директивы). Про это нужно помнить, при задании дополнительных условий.

Синтаксис директивы RewriteRule:

RewriteRule Шаблон Подстановка [Флаги]

Пример:

    RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

Где:

1.    RewriteRule  – это название директивы – правила.
2.    Шаблон — это как раз то условие, выполнение которого запускает исполнение правила. Это условие — Шаблон представляет собой perl совместимое регулярное выражение, которое применяется к текущему URL.
3.    Подстановка – это как раз тот алгоритм изменения URL, т.е. правило изменения(преобразования) URL.
4.    [Флаги] подстановки — Третий аргумент директивы RewriteRule. Флаги — это разделённый запятыми, заглавные спец символы, заключенные в квадратные скобки. Флаги дополняют преобразование URL.

Параметры в правиле записываются в одну строку начиная с имени директивы и отделяются друг от друга пробелом.

Теперь давайте разберем пример правила RewriteRule:

    RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

1.    ^(.*)$ — это Шаблон, регулярное выражение которое применится к текущему URL. Кто знаком с регулярными выражении, сможет прочитать его так: искать в текущей строке URL от начала строки(знак ^) до конца строки(знак $) любой символ (знак .) в количестве от нуля до бесконечности (знак *). Так как в этом РВ есть скобки(), то та часть URL которая будет соответствовать условию в скобках будет захвачена в переменную подстановки $1, которую мы потом сможем использовать в Подстановке или в СравниваемаяСтрока(это в директиве RewriteCond, о ней ниже).
2.     index.php?/$1 — Подстановка – это собственно и есть правило преобразования URL. Запись index.php?/$1 означает, что строка нового, преобразованного URL должна быть составлена из двух частей, где первая часть строки это постоянное значениеindex.php?/ а вторая часть строки это значение из переменной подстановки $1. Тут мы вспоминаем что в $1 храниться та часть URL которая соответствовала РВ в скобах из параметра Шаблон. В итоге мы получаем преобразованный URL вида index.php?/URL_по которому обратились. По другому сказать так, что для всех запросов выполняется внутренне перенаправление на файл index.php.
3.    [L,QSA] – флаги, где ‘last|L’ — последнее правило что означает — остановить процесс преобразования на этом месте и не применять больше никаких следующих правил преобразований для URL. ‘qsappend|QSA’ — добавлять строку запроса — Этот флаг указывает механизму преобразований на добавление, а не замену, строки запроса из URL к существующей, в строке Подстановка. Используйте это когда вы хотите добавлять дополнительные данные в строку запроса с помощью директив преобразований.

Шпаргалки

Шпаргалка по mod_rewrite

Шпаргалка по mod_rewrite содержит список флагов для директив RewriteRule и RewriteCond, список серверных переменных, руководство по регулярным выражениям и несколько примеров общих правил.

  • Скачать в PDF ~79 кб
  • Скачать в PNG ~79 кб

Шпаргалка по регулярным выражениям

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. 

  • Скачать в PDF ~96 кб
  • Скачать в PNG ~81 кб

Заключение

Не забывайте в регулярном выражении экранировать служебные символы. Иногда забывают экранировать точку, когда она должна выступать именно как точка, а не как принято в регулярном выражении — как любой символ.

Также не забывайте оборачивать весь блок правил для  mod_rewrite в тег: <IfModule mod_rewrite.c></IfModule>

Не пишите излишне много директив для mod_rewrite, пишите только те правила преобразования, которые вам действительно необходимы. Особенно нужно быть аккуратным с внешними ридиректами — это такие ридиректы, которые выполняются путем отправки клиенту серверного заголовка с кодом НЕ 200 (отдача полноценной страницы), а с другим кодом (чаше всего 301 и 302) и которые приводят к перенаправлению в браузере клиента на другой URL т.е. к совершению нового запроса на клиенте.

Поэтому любой внешний ридирект всегда приводит к потере времени в обработки запроса, т.к. нужно отправить клиенту ответ, он должен его прочитать, и повторить запрос уже по новому URL. Это затратная по времени процедура. Поэтому ридиректы должны быть только если они действительно вам необходимы.

www.imbf.org

Метасимволы

Пример:

RewriteRule ^old(.*)$ /new.php [L,R=301]

Используются для задания групп символов или «меток» в шаблоне. Например, метки начала или конца строки.

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

Дополнение. Все, что расположено после символа ‘#’, считается комментарием.

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

Пример:

RewriteRule (.*) $1? [R=301,L]

Модификаторы используются после обычных, спецсимволов или их групп и позволяют расширить возможности шаблонов для срабатывания правил.

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

Примеры использования:

^stena

Любые строки, начинающиеся со слова stena. Строка, начинающаяся со слова dom-stena не удовлетворит критерию.

stena$

Любые строки, заканчивающиеся набором символов stena. Строка, заканчивающаяся на stena-dom под выбор не попадёт.

.*

Любой символ повторяется любое количество раз. Под критерий попадут все строки.

^(.*)$

Выбрать любую строку и сохранить её как переменную $1 для дальнейшего использования.

[0-9]{1,6}$

Выбрать все строки, оканчивающиеся от 1 до 6 цифами из диапазона от 0 до 9.

^(.+)/(.+)$

Разбить строку на две части: до слэша и после, части строки будут доступны по переменным $1 и $2.

Флаги

Пример:

RewriteRule ^htaccess-fake$ - [G]
RewriteRule (.*) page.php?%1 [L]

Флаги — дополнительные опции. Перечисляются в квадратных скобках через запятую, скажем [NC] или [R=301,L].

R (redirect) останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (302, MOVED TEMPORARY). С данным флагом можно указать другой код результата, например «R=301» возвратит редирект с кодом 301 (MOVED PERMANENTLY).
F (forbidden) возвращает ошибку 403 (FORBIDDEN).
G (gone) возвращает ошибку 410 (GONE).
P (proxy) — по этому флагу Apache выполняет подзапрос (sub-request) к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy не входит в состав вашей сборки Apache, то применение данного флага вызовет ошибку.
L (last) останавливает процесс преобразования, и текущая ссылка считается окончательной.
N (next) запускает процесс преобразования с первого по порядку правила.
C (chain) объединяет несколько правил в цепочку. Если первое правило цепочки «не срабатывает», то вся цепочка игнорируется.
NS (nosubreq) разрешает «срабатывание» правила только для настоящих запросов, игнорируя подзапросы (подзапрос может быть вызван, например, включением файла при помощи директивы SSI).
NC (nocase) отключает проверку регистра символов при срабатывании правила.
QSA (qsappend) добавляет исходные параметры запроса (query string) к замене. Если замена не включает в себя новые параметры запроса, то исходные параметры запроса добавляются автоматически. Если же включает, то без флага QSA исходные параметры запроса будут утеряны.
PT (passthrough) останавливает процесс преобразования и передает полученную новую ссылку дальше «по цепочке», чтобы над ней могли «поработать» директивы Alias, ScriptAlias, Redirect и им подобные (тогда как при флаге L новая ссылка считается окончательной и не подлежит дальнейшей обработке).
S (skip) пропускает следующее правило, если данное правило «сработало». Можно пропускать несколько правил, если указать их количество, например: «S=3».
E (env) устанавливает переменную окружения, например: «E=переменная:значение».

Проверки

Пример:

RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*)$ $1.php

В условиях могут быть использованы следующие проверки:

1. Вы можете предварить шаблон символом ‘!’, чтобы обозначить несоответствие шаблону.

2. Можно выполнить лексикографическое сравнение строк:

<Условие Лексикографически меньше
<Условие Лексикографически больше
= Условие Равенство
<= Условие Лексикографически меньше или равно
>= Условие Лексикографически больше или равно

3. Сравнение, как целых чисел:

-eq Численно равно
-ge Численно больше или равно
-gt Численно больше
-le Численно меньше или равно. Во избежание путаницы с заглавной буквой -l используйте -L
-lt Численно меньше. Во избежание путаницы с заглавной буквой -l используйте -L

4. Тест на различные атрибуты файлов:

-d Является ли директорией.
-f Является ли обычным файлом.
-F Существует ли файл.
-l Является ли символической ссылкой.
-L Является ли символической ссылкой. Аналог флага -l.
-s Является ли обычным файлом ненулевого размера
-U Существует ли заданный URL
-x Является ли файл исполняемым.

5. Все эти проверки также могут быть предварены префиксом восклицательный знак (‘!’) для инвертирования их значения.

Переменные

Пример:

RewriteCond %{REQUEST_URI} /+[^.]+$ RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L] 
HTTP_USER_AGENT Содержит информацию о типе и версии браузера и операционной системы посетителя.
HTTP_REFERER Приводится адрес страницы, с которой посетитель пришёл на данную страницу.
HTTP_COOKIE Список COOKIE передаваемых браузером
HTTP_FORWARDED Страница непосредственно с которой перешел пользователь
HTTP_HOST Адрес сервера, например host.com
HTTP_ACCEPT Описываются предпочтения клиента относительно типа документа.
REMOTE_ADDR IP-адрес посетителя.
REMOTE_HOST Адрес посетителя в нормальной форме — например, rt99.net.com
REMOTE_IDENT Имя удаленного пользователя. Имеет формат имя.хост, например, kondr.www.rtt99.net.com
REMOTE_USER То-же, что и REMOTE_IDENT, но содержит только имя. Пример: kondr
REQUEST_METHOD Позволяет определить тип запроса (GET или POST). Должен обязательно анализироваться, т.к. определяет дальнейший способ обработки информации
SCRIPT_FILENAME Полный путь к вебстранице на сервере.
PATH_INFO Содержит в себе все, что передавалось в скрипт.
QUERY_STRING Содержит строчку, переданную в качестве запроса при вызове CGI скрипта.
AUTH_TYPE Используется для идентификации пользователя
DOCUMENT_ROOT Cодержит путь к корневой директории сервера.
SERVER_ADMIN Почтовый адрес владельца сервера, указанный при установке.
SERVER_NAME Адрес сервера, типа kondr.host.com
SERVER_ADDR IP-адрес вашего сайта.
SERVER_PORT Порт на котором работает Apache.
 SERVER_PROTOCOL  Версия HTTP протокола.
 SERVER_SOFTWARE  Название сервера, например, Apache/1.3.2 (Unix)
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
Переменные предназначены для работы со временем в разных форматах.
API_VERSION Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h.
THE_REQUEST Полная строка HTTP запроса отправленная браузером серверу (т.е., «GET /index.html HTTP/1.1»). Она не включает какие-либо дополнительные заголовки отправляемые браузером.
REQUEST_URI Ресурс, запрошенный в строке HTTP запроса.
REQUEST_FILENAME Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.
IS_SUBREQ Будет содержать текст «true» если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированы модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи.

Логика исполнения правила (RewriteRule)

Исполнение же правила подразумевает следующие действия: первым делом механизм преобразования выполняет поиск дополнительных условий для этого правила (RewriteCond директивы). Помним, что по историческим причинам дополнительные условия находятся перед правилами(RewriteRule). Если дополнительные условия для этого правила отсутствуют, то механизм преобразований тупо выполняет указанное в правиле преобразование текущего URL и переходит к следующему правилу. Однако если для исполняемого правила (RewriteRule) существуют дополнительные условия, указанные ПЕРЕД НИМ в директивах RewriteCond, то запускается внутренний цикл для обработки этих дополнительных условий в том порядке, в котором они перечислены, сверху вниз.

Если из имеющихся для правила дополнительных условий хотя бы одно условие НЕ выполняется это приводит к остановке запущенного процесса исполнения правила, и преобразование над URL, заданное в правиле, НЕ выполняется. Что бы запущенное на исполнение правило выполнилось до конца и изменило URL, необходимо, что бы выполнились ВСЕ дополнительные условия, указанные в директивах RewriteCond перед этим правилом!

Тут нужно дополнительно пояснить, что директивы RewriteCond по умолчанию объединены между собой оператором AND в одно составное условие. Просто этот оператор(AND) не записывается по умолчанию. От сюда и такая логика, что нужно, что бы все дополнительные условия были истинными (т.к. они объедены через AND) для удачного завершения преобразования URL. Однако директивы RewriteCond можно объединить условием OR при помощи флагов (см. синтаксис директивы). Про это нужно помнить, при задании дополнительных условий.

Синтаксис директивы RewriteRule:

RewriteRule Шаблон Подстановка [Флаги]

Пример:

 RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

Где:

1.    RewriteRule  – это название директивы – правила.
2.    Шаблон — это как раз то условие, выполнение которого запускает исполнение правила. Это условие — Шаблон представляет собой perl совместимое регулярное выражение, которое применяется к текущему URL.
3.    Подстановка – это как раз тот алгоритм изменения URL, т.е. правило изменения(преобразования) URL.
4.    [Флаги] подстановки — Третий аргумент директивы RewriteRule. Флаги — это разделённый запятыми, заглавные спец символы, заключенные в квадратные скобки. Флаги дополняют преобразование URL.

Параметры в правиле записываются в одну строку начиная с имени директивы и отделяются друг от друга пробелом.

Теперь давайте разберем пример правила RewriteRule:

 RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

1.    ^(.*)$ — это Шаблон, регулярное выражение которое применится к текущему URL. Кто знаком с регулярными выражении, сможет прочитать его так: искать в текущей строке URL от начала строки(знак ^) до конца строки(знак $) любой символ (знак .) в количестве от нуля до бесконечности (знак *). Так как в этом РВ есть скобки(), то та часть URL которая будет соответствовать условию в скобках будет захвачена в переменную подстановки $1, которую мы потом сможем использовать в Подстановке или в СравниваемаяСтрока(это в директиве RewriteCond, о ней ниже).
2.     index.php?/$1 — Подстановка – это собственно и есть правило преобразования URL. Запись index.php?/$1 означает, что строка нового, преобразованного URL должна быть составлена из двух частей, где первая часть строки это постоянное значениеindex.php?/ а вторая часть строки это значение из переменной подстановки $1. Тут мы вспоминаем что в $1 храниться та часть URL которая соответствовала РВ в скобах из параметра Шаблон. В итоге мы получаем преобразованный URL вида index.php?/URL_по которому обратились. По другому сказать так, что для всех запросов выполняется внутренне перенаправление на файл index.php.
3.    [L,QSA] – флаги, где ‘last|L’ — последнее правило что означает — остановить процесс преобразования на этом месте и не применять больше никаких следующих правил преобразований для URL. ‘qsappend|QSA’ — добавлять строку запроса — Этот флаг указывает механизму преобразований на добавление, а не замену, строки запроса из URL к существующей, в строке Подстановка. Используйте это когда вы хотите добавлять дополнительные данные в строку запроса с помощью директив преобразований.

Шпаргалки

Шпаргалка по mod_rewrite

Шпаргалка по mod_rewrite содержит список флагов для директив RewriteRule и RewriteCond, список серверных переменных, руководство по регулярным выражениям и несколько примеров общих правил.

  • Скачать в PDF ~79 кб
  • Скачать в PNG ~79 кб

Шпаргалка по регулярным выражениям

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. 

  • Скачать в PDF ~96 кб
  • Скачать в PNG ~81 кб

Заключение

Не забывайте в регулярном выражении экранировать служебные символы. Иногда забывают экранировать точку, когда она должна выступать именно как точка, а не как принято в регулярном выражении — как любой символ.

Также не забывайте оборачивать весь блок правил для  mod_rewrite в тег: <IfModule mod_rewrite.c></IfModule>

Не пишите излишне много директив для mod_rewrite, пишите только те правила преобразования, которые вам действительно необходимы. Особенно нужно быть аккуратным с внешними ридиректами — это такие ридиректы, которые выполняются путем отправки клиенту серверного заголовка с кодом НЕ 200 (отдача полноценной страницы), а с другим кодом (чаше всего 301 и 302) и которые приводят к перенаправлению в браузере клиента на другой URL т.е. к совершению нового запроса на клиенте.

Поэтому любой внешний ридирект всегда приводит к потере времени в обработки запроса, т.к. нужно отправить клиенту ответ, он должен его прочитать, и повторить запрос уже по новому URL. Это затратная по времени процедура. Поэтому ридиректы должны быть только если они действительно вам необходимы.

 

Взял тут: www.imbf.org

not-alone.ru

Для создания правил в .htaccess, в частности при использовании RewriteRule, RewriteCond или RedirectMatch, используется специальный синтаксис и регулярные выражение. Для многих это темный лес, хотя сложного в этом ничего нет. Под синтаксисом подразумевается использование специальных символов, которые имеют особое значение.
На регулярных выражениях стоит остановиться отдельно — это рабочие лошадки для созданий гибких правил в .htaccess. По своей сути регулярное выражение является шаблоном, с которым сравнивается исходная строка. Ниже список специальных символов и их описание:

  • “^” — символ обозначающий начало строки. При создании правил с использованием директив RedirectMatch и RewriteRule, в начале шаблона следует указывать этот символ, для обозначения начала строки.

    RewriteRule ^test$ /test2.html
    В этом примере строка должна начинаться с "test". То есть, адрес вида cat/test не будет преобразован, потому что начало строки у него "cat", а не "test"

  • “$” — символ обозначающий конец строки. Следует указывать в конце шаблона для обозначения конца строки.

    RewriteRule ^test$ /test2.html
    В этом примере строка должна заканчиваться на "test". То есть, адрес test/some_url не будет преобразован, потому что конец строки у него "some_url, а не "test".

  • “()” — круглые скобки. Используются для выделения группы символов. Группировка, в том числе необходима для использования обратных RewriteCond и RewriteRule связей.

    RewriteRule ^test/(.*).html$ /test2/$1.html
    В этом примере в скобах сгруппированы символы находящиеся после /test/ и перед .html.

  • “.” — точка. Обозначает любой символ.

    RewriteRule ^te.t$ /test2.html
    В этом примере вместо точки может быть использован любой символ, в том числе и точка. То есть teet -> test2.html или tezt -> test2.html и т.д.

  • “|” — альтернативный выбор. Например, выражения "A|B" означают "A или B".

    RewriteRule ^te(s|z|r|g)t$ /test2.html [R=301,L]
    Символы для выбора следует объединять в группы. В этом примере только с адресов /test, /tezt, /tert и /tegt будет произведен редирект на адрес /test2.html.

  • “?” — ставится после символа или группы символов. Обозначает, что этот символ (группа) может как присутствовать, так и отсутствовать.

    RewriteRule ^tes?t$ /test2.html
    "test" или "tet" будут преобразованы в test2.html. То же самое с группами символов в скобках.

  • “*” — ставится после символа (группы). Обозначает, что символ (группа) может отсутствовать или присутствовать неограниченное число раз подряд.

    RewriteRule ^te*st$ /test2.html
    tst, test или teeeeeeeeest будут преобразованы в test2.html. То же самое с группами символов в скобках.

  • “+” — действует аналогично символу “*”, но предшествующий ему символ обязательно должен присутствовать хотя бы один раз.

    RewriteRule ^tes+t$ /test2.html
    test или tessssssst будут преобразованы в test2.html. То же самое с группами символов в скобках.

  • “[]” — квадратные скобки. Используются для перечисления допустимых диапазонов символов. Работает аналогично символу “|”, но является более оптимальным вариантом по удобству и быстродействию. Поддерживается указание диапазонов значений. [0-9] — все символы от 0 до 9, [a-z] или [A-Z] — все символы латинского алфавита. Если в в начале скобок стоит символ “^”, это означает перечисление недопустимых символов. [^0-9] — допускаются любые символы кроме цифр.

    RewriteRule ^te[a-z]t$ /test2.html
    На третьей позиции может находится любой символ латинского алфавита, /teat, /tebt, tect и т.д.
    RewriteRule ^te[a-z,0-9]t$ /test2.html
    Можно указывать диапазоны значений через запятую.

  • “{}” — фигурные скобки, указываются после символа, группы символов или диапазона символов. Означает минимальное и максимальное количество символов (групп), которое может присутствовать.

    RewriteRule ^(test){1,9}$ /test2 [R=301,L]
    В этом примере словосочетание "test" может присутствовать в строке 1 или 9 раз. То есть для /test, /testtest, или /testtesttesttesttesttesttesttesttest будет сработано перенаправление
    RewriteRule ^[a-z]{3,5}$ /test2 [R=301,L]
    В этом примере перенаправление сработает только для адресов состоящих только из латинских символов и содержащих от 3-х до 5-ти символов.
     

  • “” — обратный слэш. Используется для экранирования спецсимволов, когда нужно использовать их именно как обычный символ, а не как спецсимвол.

    RewriteRule ^test.html$ /test2.html
    В этом примере перед "." стоит обратный слеш, соответственно точка будет воспринята именно как точка, а не как любой символ. Если его убрать, вместо точки может быть использован абсолютно любой символ.​​

  • “$N” — "N" это число от 0 до 9. Используется для обращения к группам символов из шаблона ​RewriteRule для последующей подстановки, обратная RewriteRule связь.

    RewriteRule ^test/(.*).html$ /test2/$1.html
    В этом примере все символы в круглых скобках подставляются вместо $1. /test/some-url -> /test2/some-url​​

  • “%N” — "N" это число от 0 до 9. Используется для обращения к группам символов из шаблона ​RewriteCond для последующей подстановки, обратная RewriteRule связь.

    RewriteCond %{QUERY_STRING} ^id=(.*)$
    RewriteRule ^(.*)$ /test/%1? [R=301,L]
    В этом примере группа символов в директиве RewriteCond будет подставлена вместо %1.

hostgid.net


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.