Синтаксис htaccess, полное руководство — Дмитрий Лео
Метасимволы
Пример:
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 ^(.+)/(.+)$ /?a=$1&b=$2 [R=301,L]
http://www.site.com/1/2/3/4/5 →
http://www.site.com/?a=1/2/3/4&b=5
Флаги
Пример:
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 | |
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, список серверных переменных, руководство по регулярным выражениям и несколько примеров общих правил.
Шпаргалка по регулярным выражениям
Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка.
Заключение
Не забывайте в регулярном выражении экранировать служебные символы. Иногда забывают экранировать точку, когда она должна выступать именно как точка, а не как принято в регулярном выражении — как любой символ.
Также не забывайте оборачивать весь блок правил для mod_rewrite в тег: <IfModule mod_rewrite.c></IfModule>
Не пишите излишне много директив для mod_rewrite, пишите только те правила преобразования, которые вам действительно необходимы. Особенно нужно быть аккуратным с внешними ридиректами — это такие ридиректы, которые выполняются путем отправки клиенту серверного заголовка с кодом НЕ 200 (отдача полноценной страницы), а с другим кодом (чаше всего 301 и 302) и которые приводят к перенаправлению в браузере клиента на другой URL т.е. к совершению нового запроса на клиенте.
Поэтому любой внешний ридирект всегда приводит к потере времени в обработки запроса, т.к. нужно отправить клиенту ответ, он должен его прочитать, и повторить запрос уже по новому URL. Это затратная по времени процедура. Поэтому ридиректы должны быть только если они действительно вам необходимы.
Файл .htaccess и RewriteRule
В последнее время мне стало интересно изучать низкоуровневые подходы минуя тот функционал, который предлагают нам фреймворки. Таким образом, я открываю для себя новые знания в программировании. Когда-то я проходил все стадии написания «велосипедов», но чтобы быть нормальным проггером, нужно знать как там всё устроено, это нормально. Сегодня рассмотрим перенаправления с помощью файла .htaccess для веб-сервера Apache на небольшом примере.
Чтобы не томиться ожиданием, давайте сразу перейдём к задаче: нужно сделать перенаправление со страницы /pages/about.php на /about, т. е. убрать в адресе папку /pages и расширение .php в названии файла. Ещё нужно позаботиться о том, чтобы в конце URL не было закрывающего слеша. Вот такую файловую структуру содержит наш пример:
┌public_html/ ├──pages/ │ ├──about.php │ ├──contact.php │ └──subscribe.php ├──index.php └──.htaccess
В Apache для преобразования URL’ов есть специальный модуль mod_rewrite. Он отвечает за создание ЧПУ — создаёт красивые URL для PHP-скриптов на уровне веб-сервера. Его мы и задействуем для решения нашей задачи. Для начала создадим конфигурационный файл .htaccess в корне сайта со следующим содержимым, а затем я объясню как он отработает:
# Включаем mod_rewrite RewriteEngine On # Убираем последний слеш RewriteRule ^(.*)/$ /$1 [L,R=301] # Преобразуем /pages/about.php в /about RewriteRule ^(\w+)$ /pages/$1.php [L,NC]
Командой RewriteEngine On мы включаем модуль mod_rewrite, а с помощью RewriteRule задаём правила преобразования адресов. RewriteRule просто преобразует входной URL по порядку в соответствии с регулярными выражениями. В конце каждого правила можно задать флаги для указания поведения mod_rewrite при обработке URL. Синтаксис прост как три копейки:
RewriteRule новый реальный [флаг1,флаг2,флаг3]
Давайте разберём первое правило из примера: ^(.*)/$ /$1 [L,R=301] — между маркерами ^ и $ мы указали начало строки с любого символа и любой длины (.*), где конец строки должен заканчиваться на слеш /. Всё, что заключено в круглые скобки (.*) образует группу символов, которую можно использовать через макрос $1.
Теперь все URL’ы, которые заканчиваются на слеш, будут переброшены на адрес без последнего слеша, где /$1 — все входные символы без последнего слеша. Флаг [L] останавливает чтение .htaccess, а [R=301] генерирует HTTP-код ответа сервера HTTP/1.1 301 Moved Permanently. После того, как правило отработало и Apache обрезал закрывающий слеш, файл .htaccess выполнится ещё раз и первое правило больше не отработает.
Второе правило: ^(\w+)$ /pages/$1.php [L,NC] — пользователь запросит адрес страницы, который имеет буквенное или цифровое содержимое от одного и больше символов (\w+). Это образует группу символов, которые мы подставим в адрес скрипта /pages/$1.php. По факту выполниться скрипт под другим URL. Флаг [L] останавливает .htaccess, а [NC] отменяет проверку регистра символов.
Все правила выполняются по порядку. Также стоит обратить внимание на значение флагов, которые могут менять поведение RewriteRule и веб-сервера. Ниже я собрал коллекцию флагов применительно для перенаправлений:
Флаг Описание ——————————————————————————————————————————————————————————————————————————————— [C] Chain — объединяет несколько правил в цепочку. Если первое правило цепочки не срабатывает, то вся цепочка игнорируется. [F] Forbidden — возвращает ошибку 403 Forbidden (запрещено). [G] Gone — возвращает ошибку 410 Gone (удалён). [L] Last — останавливает процесс преобразования, и текущая ссылка считается окончательной. [N] Next — запускает процесс преобразования с первого по порядку правила. [NS] NoSubreq — разрешает срабатывание правила только для настоящих запросов, игнорируя подзапросы. [NC] NoCase — отключает проверку регистра символов. [P] Proxy — даёт команду Apache выполнить подзапрос к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy отсутствует, то произойдет ошибка. [PT] PassThrough — останавливает процесс преобразования и передает полученную новую ссылку дальше по цепочке. [QSA] Qsappend — добавляет исходные параметры запроса (Query String) к замене. Если замена не включает в себя новые параметры запроса, то исходные параметры запроса добавляются автоматически. Если же включает, то без флага QSA исходные параметры запроса будут утеряны. [R] Redirect — останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на новую страницу. По умолчанию передаётся HTTP-код 302 Moved Temporarily (перемещенно временно), но его можно изменить путём присвоения нового статуса через знак равенства [R=301]. В этом случае будет передан HTTP-код 301 Moved Permanently (перемещено навсегда). [S] Skip — пропускает следующее правило, если текущее правило сработало. Можно указать количество последующих игнорируемых правил [S=2].
Полезные ссылки:
Остальные флаги в документации Apache
Как на самом деле работает mod_rewrite
Описание основных флагов mod_rewrite
Волшебный файл .htaccess
Коллекция сниппетов .htaccess
.htaccess — Википедия
Материал из Википедии — свободной энциклопедии
.htaccess (/’eɪtʃtiːæk.sɛs/[источник не указан 464 дня] от англ. hypertext access) — файл дополнительной конфигурации веб-сервера Apache, а также подобных ему серверов. Позволяет задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т.д., без изменения главного конфигурационного файла.
.htaccess является подобием httpd.conf с той разницей, что действует только на каталог, в котором располагается, и на его дочерние каталоги. Возможность использования .htaccess в том или ином каталоге указывается в httpd.conf (директива AllowOverride
).
Файл .htaccess может быть размещён в любом каталоге. Директивы этого файла действуют на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов .htaccess). Для того чтобы эти файлы .htaccess можно было использовать, необходимы соответствующие настройки главного конфигурационного файла (значение директивы AllowOverride
должно быть установлено All
). Как правило, подавляющее большинство хостеров разрешают использовать свои файлы .htaccess.
- Авторизация, аутентификация
- Файлы .htaccess часто используются для указания ограничений для конкретного каталога. Файл .htaccess часто используется вместе с .htpasswd, который сохраняет имена пользователей и их пароли.
- Собственные страницы ошибок
- Изменение страниц, которые отдаются при ошибках на стороне сервера, например HTTP 404 Not Found.
- Изменение URL-адресов
- Серверы используют .htaccess для изменения длинных, излишне сложных URL-адресов на короткие и легко запоминающиеся.
- Контроль кеша
- Файлы .htaccess позволяют серверу контролировать кеширование веб-браузерами и кеширующими прокси для уменьшения использования полосы, загрузки сервера и лагов.
- Изменение опций веб-сервера и его плагинов
- Некоторые веб-серверы допускают изменение опций через .htaccess, например, опций PHP-плагина.
- .htpasswd — файл, содержащий пароли для доступа к ресурсу у веб-сервера Apache.
Директивы .htaccess — Викиучебник
Перенаправление (редирект)[править]
На другой адрес[править]
Redirect /index.php http://example.com/index.php
При запросе определённых страниц[править]
Redirect /data http://www.example.com/data Redirect /forum http://forum.example.com
По маске имени файла[править]
Следующие строки определяют, что все запросы, кроме запросов к файлам с расширениями .gif и .jpg, будут перенаправлены на файл index.php:
RewriteEngine On RewriteRule !.(gif|jpg)$ index.php
Работает только при наличии mod_rewrite.
По IP-адресам[править]
Если посетитель имеет IP-адрес 192.168.11.1, то ему будет открыта страница data.html:
SetEnvIf REMOTE_ADDR 192.168.11.1 REDIR="redir" RewriteCond %{REDIR} redir RewriteRule ^/$ /data.html
Если посетители имеют IP-адреса 192.168.11.1 и 192.168.11.2, то им будет открыт адрес http://example.com
:
RewriteEngine on RewriteCond %{REMOTE_ADDR} (192.168.11.1|192.168.11.2) RewriteRule .* http://example.com [R=301,L]
Работает только при наличии mod_rewrite.
В зависимости от реферера (ссылающейся страницы)[править]
RewriteCond %{HTTP_REFERER} http://example.com RewriteRule ^/original.html$ /another.html [L]
В данном случае все посетители пришедшие с сайта example.com вместо файла original.html получат файл another.html.
Удаление префикса «www.» из адреса[править]
Перенаправление с http://www.mydomain.com
на http://mydomain.com
:
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www.mydomain.com$ [NC] RewriteRule (.*) http://mydomain.com/$1 [R=301]
Работает только при наличии mod_rewrite.
Индексные страницы[править]
Переопределение индексного файла[править]
DirectoryIndex index.html index.php index.shtml
Запрет на отображение содержимого каталога при отсутствии индексного файла[править]
Типы файлов[править]
Изменение обработчика по типу файла[править]
Пример переопределения HTML-файлов для обработки их с помощью PHP:
RemoveHandler .html .htm AddType application/x-httpd-php .php .htm .html .phtml
Обработка ошибок[править]
ErrorDocument 401 /401.html ErrorDocument 403 /403.html ErrorDocument 404 /404.html ErrorDocument 500 /500.html
При этом размер конечного файла должен быть больше 515 байт, иначе некоторые браузеры могут подменить страницу своей стандартной.
Кодировка[править]
Отдаваемых файлов[править]
AddDefaultCharset windows-1251
Загружаемых файлов[править]
CharsetSourceEnc windows-1251
Отдаваемых файлов конкретного типа[править]
AddCharset windows-1251 .js
Вместо .js можно указать несколько типов файлов, разделяя их пробелами.
Управление доступом[править]
Запрет доступа к файлам[править]
Запрет доступа ко всем файлам и каталогам в текущем каталоге:
Запрет доступа к определённому файлу:
<Files config.php> Deny from all </Files>
Запрет доступа к файлам по маске:
<Files *.inc> Deny from all </Files>
Спецсимволы для определения маски:
- ? — любой одиночный символ
- * — любая последовательность символов, исключая символ / (слэш)
Запрет доступа к файлам по регулярному выражению:
<Files ~ "\.(inc|conf|cfg)$"> Deny from all </Files>
Определение доступа по IP[править]
Order deny,allow Deny from all Allow from 192.168.11.1
Строка order deny, allow определяет, в каком порядке следует выполнять директивы. Сначала выполняется директива запрета доступа, а затем разрешается доступ только для IP-адреса 192.168.11.1.
Order Allow,Deny Allow from all Deny from 192.140.170.219 Deny from 10.10.220.201
В этом примере наоборот запрещается доступ с определённых IP-адресов.
Закрытие каталогов паролем[править]
AuthName "Auth message" AuthType Basic require <valid-user | user <username1> [username2] ... [usernameN]> AuthUserFile "/full/path/to/.htpasswd"
Пароли хранятся в файле .htpasswd.
Оригинальный файл .htaccess для CMS MODX
Содержимое стандартного файла .htaccess для CMS MODX Revolution 2.
# MODX supports Friendly URLs via this .htaccess file. You must serve web# pages via Apache with mod_rewrite to use this functionality, and you must
# change the file name from ht.access to .htaccess.
#
# Make sure RewriteBase points to the directory where you installed MODX.
# E.g., «/modx» if your installation is in a «modx» subdirectory.
#
# You may choose to make your URLs non-case-sensitive by adding a NC directive
# to your rule: RewriteRule ^(.*)$ index.php?q=$1 [L,QSA,NC]
RewriteEngine On
RewriteBase /
# Rewrite www.domain.com -> domain.com — used with SEO Strict URLs plugin
#RewriteCond %{HTTP_HOST} .
#RewriteCond %{HTTP_HOST} !^example-domain-please-change\.com [NC]
#RewriteRule (.*) http://example-domain-please-change.com/$1 [R=301,L]
#
# or for the opposite domain.com -> www.domain.com use the following
# DO NOT USE BOTH
#
#RewriteCond %{HTTP_HOST} .
#RewriteCond %{HTTP_HOST} !^www\.example-domain-please-change\.com [NC]
#RewriteRule (.*) http://www.example-domain-please-change.com/$1 [R=301,L]
# Rewrite secure requests properly to prevent SSL cert warnings, e.g. prevent
# https://www.domain.com when your cert only allows https://secure.domain.com
#RewriteCond %{SERVER_PORT} !^443
#RewriteRule (.*) https://example-domain-please-change.com/$1 [R=301,L]
# The Friendly URLs part
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
# Make sure .htc files are served with the proper MIME type, which is critical
# for XP SP2. Un-comment if your host allows htaccess MIME type overrides.
#AddType text/x-component .htc
# If your server is not already configured as such, the following directive
# should be uncommented in order to set PHP’s register_globals option to OFF.
# This closes a major security hole that is abused by most XSS (cross-site
# scripting) attacks. For more information: http://php.net/register_globals
#
# To verify that this option has been set to OFF, open the Manager and choose
# Reports -> System Info and then click the phpinfo() link. Do a Find on Page
# for «register_globals». The Local Value should be OFF. If the Master Value
# is OFF then you do not need this directive here.
#
# IF REGISTER_GLOBALS DIRECTIVE CAUSES 500 INTERNAL SERVER ERRORS :
#
# Your server does not allow PHP directives to be set via .htaccess. In that
# case you must make this change in your php.ini file instead. If you are
# using a commercial web host, contact the administrators for assistance in
# doing this. Not all servers allow local php.ini files, and they should
# include all PHP configurations (not just this one), or you will effectively
# reset everything to PHP defaults. Consult www.php.net for more detailed
# information about setting PHP directives.
#php_flag register_globals Off
# For servers that support output compression, you should pick up a bit of
# speed by un-commenting the following lines.
#php_flag zlib.output_compression On
#php_value zlib.output_compression_level 5
# The following directives stop screen flicker in IE on CSS rollovers. If
# needed, un-comment the following rules. When they’re in place, you may have
# to do a force-refresh in order to see changes in your designs.
#ExpiresActive On
#ExpiresByType image/gif A2592000
#ExpiresByType image/jpeg A2592000
#ExpiresByType image/png A2592000
#BrowserMatch «MSIE» brokenvary=1
#BrowserMatch «Mozilla/4.[0-9]{2}» brokenvary=1
#BrowserMatch «Opera» !brokenvary
#SetEnvIf brokenvary 1 force-no-vary
Содержимое стандартного файла .htaccess для CMS MODX Evolution 1.
# For full documentation and other suggested options, please see# http://svn.modxcms.com/docs/display/MODx096/Friendly+URL+Solutions
# including for unexpected logouts in multi-server/cloud environments
# and especially for the first three commented out rules
#php_flag register_globals Off
#AddDefaultCharset utf-8
#php_value date.timezone Europe/Moscow
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
# Fix Apache internal dummy connections from breaking [(site_url)] cache
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* — [F,L]
# Rewrite domain.com -> www.domain.com — used with SEO Strict URLs plugin
#RewriteCond %{HTTP_HOST} .
#RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
#RewriteRule (.*) http://www.example.com/$1 [R=301,L]
# Exclude /assets and /manager directories and images from rewrite rules
RewriteRule ^(manager|assets)/*$ — [L]
RewriteRule \.(jpg|jpeg|png|gif|ico)$ — [L]
# For Friendly URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
# Reduce server overhead by enabling output compression if supported.
#php_flag zlib.output_compression On
#php_value zlib.output_compression_level 5