301 редирект в файле .htaccess

Перенаправляет все содержимое каталогов https:// site.ru/dir1/group1/group2/ → в  https:// site.ru/dir2/group1/group2/ 

RewriteCond %{REQUEST_URI} ^/dir1/(.*)$ 
# если строка начинается с /dir1/ 
RewriteRule ^(.*)$ /dir1%1 [R=301,L]

RewriteRule ^reviews/nashi-dovolnye-klienty/.+$ /reviews/nashi-dovolnye-klienty/ [L,R=301,NC]
RewriteRule ^reviews/video-otzyvy/.+$ /reviews/video-otzyvy/ [L,R=301,NC]
RewriteRule ^reviews/o-nas-pishut/.+$ /reviews/o-nas-pishut/ [L,R=301,NC]
RewriteRule ^promotions/.+$ /promotions/ [L,R=301,NC]
Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL.
Вариант:
RewriteCond %{REQUEST_URI} ^(.*)/ru/products/receivers/(.*)$ 
RewriteRule ^(.*)$ %1/ru/products/vintovye-kompressory-dalgakiran/receivers/%2 [R=301,L] 

Перенаправляет все содержимое каталогов /catalog/dir1/group1/group2/ → в /catalog/dir2/group1/group2/
RewriteCond %{REQUEST_URI} ^(.*)/dir1/(.*)$ 
# если строка содержит /dir1/ 
RewriteRule ^(.*)$ %1/dir2/%2 [R=301,L]

Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL


Дополнительная информация.

Синтаксис .htaccess. Полное руководство

301 редиректы в .htaccess. Список шаблонов

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

Важная информация!

  1. После настройки глобальных правил редиректов (любые перенаправления, кроме редиректа со страницы на страницу) ставьте задачу на разработчика по проверке форм и корзины. Так как часто ломаются формы и клиент не получает заказы

  2. Не правьте файл .htaccess через административную панель сайта (админку), так как если сайт ляжет, то вы не сможете ничего править

Правила по настройке файла

Правило №1. Написанное ниже нужно вставить в самое начало .htaccess

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

Правило №2. В начале мелкие редиректы, потом глобальные

В начале файла .htaccess всегда идут постраничные редиректы (редирект с страницы на страницу), потом с раздела на раздел, а уже после глобальные правила (такие как с http на https, с www на без www и прочее).

Правило №3. Если что-то написано в #, то оно не учитывается

Если вы в начале любого правила напишите #, то такой редирект не сработает, так как он просто не будет учитываться. С помощью # пишите комментарии, чтобы другой SEO-специалист понял что за редирект вы сделали

Правило №4. Создайте копию на компьютере перед редактированием

Убедитесь в том, что вы сохранили у себя на ПК резервную копию оригинального файла .htaccess, прежде чем вносить какие-либо изменения, чтобы можно было вернуть обратно.

Правило №5. Просто посмотрите на примере

Чтобы стало понятно что мы тут понаписали, проще увидеть пример и мы подготовили его для вас с подробным описанием.

Редирект с 1 страницы сайта на другую

#Обычный редирект с страницы сайта на другую
Redirect 301 /old-stranitsa https://site.ru/new-stranitsa
#Редирект с 1 страницы на другую на
MODX RewriteRule ^old-page/$ new-page/ [R=301,NC,L]
#Редирект с 1 страницы сайта на другую в OpenCart
RewriteCond %{QUERY_STRING} ^_route_=old-page/old-page/$ RewriteRule ^(.*)$ https://my-site.com/new-page/new-page/? [R=301,L]
#Редирект с 1 страницы на другую для URL и домена на кириллице на URL на латинице
Redirect 301 /ru/product/старая-страница/ https://xn--b1aghu1a.xn--p1acf/ru/product/novaya-stranicza/

Редиректы, если в URL есть пробел

Чтобы в .htaccess работал редирект с пробелами ссылку нужно заключать в кавычки (без спецсимволов), т.е:

#Для WordPress и прочих CMS
Redirect 301 "/old page" "https://site.ru/new-stranitsa" #Для сайтов на MODX
RewriteRule "^/?old-page/montazh cherepiczy instrukc$" "https://site.ru/new-page/" [R=301,L]

Редиректы с домена на домен

#Редирект с главной страницы на другой домен
RewriteEngine On RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ https://site.ru/ [L,R=301] #Редирект с домена на домен
RewriteEngine On RewriteCond %{HTTP_HOST} old-site.ru
RewriteRule (.*) https://new-site.ru/$1 [R=301,L]

Редиректы для URL с GET-параметрами

#Редирект делает редиректы с страниц типа: ?product_id=858
RewriteCond %{QUERY_STRING} (?:^|&)^product_id\=858(?:$|&)
RewriteRule ^index\.php$ /catalog/new_page? [L,R=301] #Редирект с GET-параметрами
RewriteCond %{QUERY_STRING} (^|&)product_cat\=uncategorized($|&)
RewriteRule ^$ /katalog #Настройка редиректа с GET-параметром c страницы на страницу #url до параметра
RewriteCond %{REQUEST_URI} ^/component/virtuemart/$ #то, что после параметра (вместо ?= ставится ^)
RewriteCond %{QUERY_STRING} ^page=shop.browse&category_id=12 #новый url RewriteRule ^.*$ /arenda-gruzovogo-avto.html? [R=301,L]

Редирект страниц на https-версию

#Вариант №1
RewriteEngine On RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] #Вариант №2
RewriteEngine On RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Если не сработало, попробуйте варианты, которые указаны ниже

RewriteEngine On
RewriteCond% {HTTPS} off
RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] RewriteEngine On
RewriteCond %{HTTPS} =off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L] RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

Редирект для слешей (/)

Убираем повторяющиеся слеши (/) в URL

RewriteCond %{THE_REQUEST} //
RewriteCond %{QUERY_STRING} !http(s|)://
RewriteRule .* /$0 [R=301,L]

Редирект с множественных слешей (/////) и http на 1 слеш (/) и https

RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]

Редирект с множественных слешей (/////) и на без слеша (/)

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

Автоматическая подстановка слеша (/) в конце адреса.

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

RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

Добавляем слеш(/), если его нет, и это не файл.

*Не добавляйте на сайты на Elementor (WordPress)

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

Переадресация с www на без www и наоборот

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

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

Редирект без www на версию с www

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

Перенаправление домена с www на без www, если домен на русском

RewriteEngine On RewriteCond %{HTTP_HOST} ^www.xn--80adaxca8c.xn--p1ai$ [NC]
RewriteRule ^(.*)$ https://xn--80adaxca8c.xn--p1ai/$1 [R=301,L]

Перенаправление всего домена одновременно с версии с www на версию без www и с HTTP на HTTPS

При использовании данного правила не используйте отдельные правила редиректов с http на https и www. В редких случаях из-за такого могут вовсе не работать все редиректы.

RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Прочие массовые редиректы

С одной категории сайта на другую

RewriteCond %{REQUEST_URI} ^(.*)/old-stratitha/(.*)$
RewriteRule ^(.*)$ %1/new-stratitha/%2 [R=301,L]

Убираем html на конце URL

RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ $1 [R=301,L]
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html

Убираем index.php на конце URL

#Настройка редиректа с index.php на конце
RewriteEngine On RewriteCond %{REQUEST_URI} ^/(.*?)/index\.php$
RewriteRule ^ /%1/ [R=301,L]

Не забываем заменять https://site.ru/ на адрес своего сайта, иначе редиректы не сработают!

#Вариант №2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ https://site.ru/ [R=301,L] 

#Вариант №3
RewriteCond %{REQUEST_URI} /index.php
RewriteRule ^(.*)$ https://site.ru/ [R=301,L]

Массовый редирект одновременно с index.php и index.html

#Вариант №1
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTPS/
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L] 

#Вариант №2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L]

 #Вариант №3
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
RewriteRule ^(.*)index\.php$ https://%{HTTP_HOST}/$1 [R=301,L] 

#Вариант №4
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(htm)\ HTTP/
RewriteRule ^(.*)index\.(htm)$ $1 [R=301,L]

Перенаправление в случае обновления веб-ресурса

*Вместо 14.124.354.80 - заменить на свой IP адресс.

RewriteEngine on
RewriteCond %{REQUEST_URI} !/info.html$
RewriteCond %{REMOTE_HOST} !^14\.124\.354\.80
RewriteRule $ http://vash-sait.ru/info.html [R=302,L]

Защита от хотлинков (кражи контента)

#Вариант №1
RewriteEngine On RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([ -a-z0-9] \.)?vash-sait\.ru [NC]
RewriteRule \.(gif|jpe?g|png)$ - [F,NC,L] 

#Вариант №2
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?ваш-домен.ru/.*$ [NC]
RewriteRule .*.(gif|jpg|png|ico)$ - [F,L]

Настройка перенаправлений на страницы ошибок (4xx, 5xx)

Пользовательская страница ошибок(404)

*Вместо указанных страниц с .html указываем адрес страницы ошибки на сайте

<>ErrorDocument 404 "/404.html"

Другие варианты страниц ошибок

ErrorDocument 401 /errors401.html ErrorDocument 403 /errors403.html ErrorDocument 404 /errors404.html ErrorDocument 500 /errors505.html

Правило для удаления лишних цифр на конце URL

RewriteEngine On RewriteRule ^(.+?)/\d+/?$ /$1/ [R=301,L]

Редиректы с верхнего регистра в нижний

Редирект с верхнего регистра в нижний ТОЛЬКО ДЛЯ URL (картинки он не трогает)

*может сделать редирект с внутренних страниц на главную, поэтому проверяйте внимательно

RewriteCond %{REQUEST_URI} ^[^A-Z]*[A-Z].*
RewriteCond %{REQUEST_URI} !(.*)\.jpg$
RewriteRule ^ https://%{HTTP_HOST}${lc:%{REQUEST_URI}} [L,R=301]

Редирект с URL в верхнем регистре на URL с нижним регистром

*Не всегда работает правильно и может создать цепочку редиректов. Если это произойдет прибегните к примеру №2

#Пример №1
RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.+)/"
RewriteRule [A-Z] %1 [R=301,L]

Пример №2

Напишите в поддержку хостинга сообщение, которое указано ниже

Доброго дня! Для сайта - https://ваш-сайт.ru/

Необходимо настроить редирект для URL-адресов с верхнего регистра в нижний. Для корректного редиректа нужно изменить файл http.conf. У нас к нему доступа нет, но он есть у вас. Нужно добавить в http.conf

RewriteMap lc int:tolower

После чего добавить в .htaccess правило

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^[^A-Z]*[A-Z].*
RewriteRule ^ https://%{HTTP_HOST}${lc:%{REQUEST_URI}} [L,R=301]

Закрываем сайт от индексации

Способ ниже закрывает сайт отдельно для каждой поисковой системы. При парсинге с помощью утилит парсит 1 страницу и выдает 404 ошибку.

Способ №1 - закрывает от всех поисковых ботов

SetEnvIfNoCase User-Agent «^Googlebot» search_bot
SetEnvIfNoCase User-Agent «^Yandex» search_bot
SetEnvIfNoCase User-Agent «^Yahoo» search_bot
SetEnvIfNoCase User-Agent «^Aport» search_bot
SetEnvIfNoCase User-Agent «^msnbot» search_bot
SetEnvIfNoCase User-Agent «^spider» search_bot
SetEnvIfNoCase User-Agent «^Robot» search_bot
SetEnvIfNoCase User-Agent «^php» search_bot
SetEnvIfNoCase User-Agent «^Mail» search_bot
SetEnvIfNoCase User-Agent «^bot» search_bot
SetEnvIfNoCase User-Agent «^igdeSpyder» search_bot
SetEnvIfNoCase User-Agent «^Snapbot» search_bot
SetEnvIfNoCase User-Agent «^WordPress» search_bot
SetEnvIfNoCase User-Agent «^BlogPulseLive» search_bot
SetEnvIfNoCase User-Agent «^Parser» search_bot

Закрывает сайт для робота Яндекс

SetEnvIfNoCase User-Agent .*yandex.* search_robot
SetEnvIfNoCase User-Agent .*mail.* search_robot
Deny from env=search_robot

Варианты ошибок в htaccess и решения

Проблема

На OpenCart при настройке массовых правил происходит редирект на URL с index.php?_route_= и только потом на рабочий URL

Решение

В htaccess неправильно настроены порядок редиректов. Нельзя размещать директивы и правила после

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

Перенесите все правила, которые стоят ниже вышеуказанного правила, на самый верх файла.


Дополнительная информация.

Синтаксис .htaccess. Полное руководство

Синтаксис .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 Полная строка 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 в тег: <IfModule mod_rewrite.c></IfModule>

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

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


Дополнительная информация

301 редирект в .htaccess

Что такое mod_rewrite?

mod_rewrite - это модуль сервера Apache для манипуляции (изменения) URL. Часто это означает получение запроса URL от посетителя и посылка ему содержания с другого URL. Например, посетитель вводит следующий URL в адресной строке браузера:
 http://www.example.com/page.html
Обычно Apache отправляет обратно пользователю содержание файла page.html. Однако с помощью mod_rewrite можно отправить содержание с другого URL, например такого:
http://www.example.com/another_page.html
Важно понимать, что изменение адреса происходит внутри сервера Apache. Адресная строка браузера по прежнему будет показывать http://www.example.com/page.html, но сервер Apache отправит содержание страницы http://www.example.com/another_page.html. В этом заключается отличие от перенаправления HTTP, которое указывает браузеру посетить другой URL.
Хотя с помощью модуля mod_rewrite можно выполнять и перенаправление HTTP и еще много других функций, таких как возвращение кодов  ошибки HTTP.
Что можно делать с помощью mod_rewrite.
Модуль mod_rewrite позволяет создавать правила манипулирования адресами URL. Например, вы можете вставить значение полученное из запрашиваемого URL в новый URL, организуя динамическое перенаправление URL. Или можно проверить переменные сервера, например, HTTP_USER_AGENT (тип браузера), и изменять URL только если используется браузер, например, Safari, запущенный на iPhone.
Вот несколько обычных функций, которые выполняет mod_rewrite:
  1. Создание "дружественных" адресов URL, которые маскируют "корявые" адреса URL. Например, вы можете маскировать с помощью отлично выглядящего адреса URL www.example.com/articles/my-article/ реальный адрес URL www.example.com/display_article.php?articleId=my-article. И каждый сможет использовать "дружественный" адрес URL вместо реального.
  2. Блокировать использование ссылок на изображения на вашем сайте. Чтобы остановить использование другими ресурсами изображений, размещенных на вашем сайте, можно использовать mod_rewrite для отправки ошибки "Forbidden", если ссылающийся URL не принадлежит вашему сайту.
  3. Перенаправление канонических адресов URL. Многие страницы доступны через несколько адресов URL — например, www.example.com/mypage.html и example.com/mypage.html. Вы можете использовать mod_rewrite постоянного перенаправления браузера  на "правильный" URL, например www.example.com/mypage.html. Помимо прочего такое использование mod_rewrite гарантирует отображение правильного URL в результатат поиска.
  4. Исключение ошибки 404 в момент реорганизации вашего сайта. Например, вы переделываете сайт и переместили страницу www.example.com/myarticle.html по новому адресу www.example.com/articles/myarticle.html. С помощью mod_rewrite вы можете перенаправить www.example.com/myarticle.html на www.example.com/articles/myarticle.html , так что  посетитель не получит ошибку 404 "не найдена" при посещении старого адреса URL. Благодаря гибкости mod_rewrite, можно легко создать правило, которое будет перенаправлять запросы на старые адреса URL на новые адреса.

Как использовать mod_rewrite

Для использования mod_rewrite, нужно создать директивы Apache для указания модулю, что нужно делать. Директивы - это простые конфигурационные установки. Часто директивы размещаются в файле .htaccess в корневой папке вашего веб сайта. Директивы применяются для всего сайта.
Две самых важных директивы mod_rewrite:
RewriteEngine: Включает/выключает механизм mod_rewrite для текущего запроса.
RewriteRule: Описывает правило изменения адреса URL.
Вот простой пример. Создайте файл .htaccess со следующим содержанием и разместите его на вашем сайте:
    RewriteEngine on
    RewriteRule ^dummy\.html$ http://www.google.com/ [R=301]
В данном файле задаются следующие установки:
RewriteEngine on - включаем механизм mod_rewrite
RewriteRule ^dummy\.html$ http://www.google.com/ [R=301] - перенаправялем запросы к странице dummy.html на сайт Google, используя перенаправление 301.
Если теперь открыть веб-браузер и посетить страницу dummy.html на вашем сайте (например, введя в адресной строке http://www.example.com/dummy.html), то , если все было сделано без ошибок, произойдет перенаправление на сайт http:// www.google.com.
Если вы получаете ошибку 404, то вероятно на вашем хостинге  не используется mod_rewrite. В данном случае надо обратиться к администратору хостинга.

Как работает RewriteRule

Вы можете использовать директиву RewriteRule для создания правил перенаправления. Обобщенный синтаксис директивы имеет вид:
RewriteRule Pattern Substitution [Optional Flags]
Pattern - регулярное выражение шаблона. Если URL соответствует шаблону, то правило выполняется. Иначе правило пропускается.
Substitution - новый URL, который будет использоваться вместо соответствующего шаблону адреса.
[Optional Flags] - один или несколько флагов, которые определяют поведение правила.
Вы можете добавить в файл .htaccess столько правил RewriteRule, сколько нужно. Модуль mod_rewrite проходит все правила каждый раз при запросе, обрабатывая соответствующие адресу URL.
Если правило изменяет запрашиваемый URL на новый адрес, то новый URL используется дальше при проходе по файлу .htaccess, и может соответствовать другому правилу RewriteRule, размещающемуся далее в файле. (Если нужно изменить такое поведение, то надо использовать флаг L ("последнее правило").)
Несколько примеров использования mod_rewrite
Самый простой способ объяснить mod_rewrite - показать его использование при решении практических задач.

Пример 1: исключение ошибки 404

Иногда происходит изменение URL страницы на вашем сайте. Такое может произойти в момент реорганизации содержания. Если поисковый механизм или другие сайты ссылаются на старый адрес URL, то пользователь получит ошибку "404 Not Found", когда он попробует воспользоваться ссылкой.
Для решения данной проблемы вы можете использовать модуль mod_rewrite для перенаправления 301. Таким образом заголовок HTTP отсылается любому браузеру, запросившему старый адрес URL, сообщая ему о том, что страница перемещена по новому адресу. Также поисковые механизмы информируются о том, что надо обновить индексы с новым адресом URL.
Следующий файл .htaccess перенаправит запросы на новый адрес URL:
RewriteEngine on
RewriteRule ^my-old-url\.html$ /my-new-url.html [R=301,L]
Правило RewriteRule работает так:
^my-old-url\.html$ - регулярное выражение, которому соответствует адрес URL для изменения. Шаблон означает: "соответствует началу адреса URL (^), за которым следует текст 'my-old-url.html', за которым следует символ окончания URL  ($)." В регулярном выражении символ точки (.) означает соответствие любому символу, поэтому нужно использовать обратный слэш, чтобы указать, что нам нужна именно точка (\.).
/my-new-url.html - вторая часть правила RewriteRule, которая описывает  на что нужно менять. В данном случае это просто /my-new-url.html.
[R=301,L] - третья часть правила, которая содержит один или несколько флагов, помещенных в квадратные скобки. Флаги позволяют добавлять определенные опции или действия к правилу. В данном примере используется 2 флага: R=301 означает "использовать перенаправление 301 на новый адрес URL"; а L означает "последнее правило", или другими словами "остановить процесс обработки URL, если он соответствует правилу ".

Пример 2: создание дружественных адресов URL

Допустим, вы  написали PHP скрипт display_article.php для вывода статей на вашем сайте. Вы можете ссылаться на статью с помощью следующего адреса URL:
http://www.example.com/display_article.php?articleId=my-article
Данный адрес выглядит уродливо и запрос внутри него (?articleId=my-article) может смущать некоторые поисковые механизмы. Гораздо лучше использовать адрес  URL  такого вида:
http://www.example.com/articles/my-article/
Вы можете задействовать mod_rewrite для преобразования ссылок первого формата во второй, что даст возможность использовать дружественные ссылки на страницах сайта, а обращение будет выполняться к реальным адресам, не видимым никому. Для этого файл .htaccess, расположенный в корневой директории вашего сайта, должен содержать следующие строки:
RewriteEngine on
RewriteRule ^articles/([^/]+)/?$ display_article.php?articleId=$1 [L]

Описание правила RewriteRule:

^articles/([^/]+)/?$ - регулярное выражение, соответствующее любому URL в формате articles/(article ID)/. Оно гласит:"соответствует началу URL (^) , за которым следует текст articles/, за которым следует один или более символов, не являющиеся слэшем ([^/]+), за которыми может следовать слэш (/?), за которым следует символ окончания URL ($)". Обратите внимание на круглые скобки вокруг части шаблона [^/]+. Таким образом текст, соответствующей данной части, например, "my-article", сохраняется для дальнейшего использования.
display_article.php?articleId=$1 - данная часть правила указывает серверу Apache использовать скрипт display_article.php , которому передается текст, соответствующий подшаблону [^/]+ из регулярного выражения первой части (например, "my-article"), в качестве параметра articleId. $1 называется обратной связью и хранит текст соответствующий подшаблону. Если регулярное выражение содержит еще один подшаблон в круглых скобках, то соответствующий ему текст будет храниться в переменной $2, и так далее.
[L] - как и в предыдущем примере мы используем флаг для остановки дальнейшей обработки URL, чтобы не произошло изменение адреса другими правилами RewriteRule.
Выше приведенное правило RewriteRule берет запрашиваемый URL в формате http://www.example.com/articles/my-article/ и преобразует его в URL вида  http://www.example.com/display_article.php?articleId=my-article.

Пример 3: предотвращаем использование ссылок на изображения на вашем сайте

Еще одной типовой задачей, которую решает использование модуля mod_rewrite, является предотвращение использования  ссылок на изображения на вашем сайте другими веб проектами. Допустим, на вашем сайте есть страница  http://www.example.com/mypage.html, которая содержит следующий тег img:
<img src="myphoto.jpg" alt="Моя фотография" />
Другой сайт может ссылаться на своих страницах прямо на вашу фотографию следующим образом:
<img src="http://www.example.com/myphoto.jpg" alt="Моя фотография" />
Это означает, что чужой сайт не только "заимствует" ваше изображение, но использует часть трафика вашего сервера для отображения изображения на своих страницах. И если чужой сайт имеет большой поток посетителей, то такое положение станет проблемой!
Вы можете использовать следующие директивы mod_rewrite для того, чтобы прекратить использование ссылок на изображения всеми другими сайтами, кроме вашего собственного.  Разместите ниже приведенный код в файле .htaccess в корневом каталоге вашего сайта или в папке с изображениями, которые надо защитить. Измените example.com на имя вашего домена.
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC]
RewriteRule .+\.(gif|jpg|png)$ - [F]
Как только вы закончите выполнять все операции копирования любой браузер , запрашивающий изображения с вашего сайта использующий при запросе URL, начинающийся с имени домена, отличного от  www.example.com или example.com , будет получать ошибку "403 Forbidden". что остановит использование ссылок на ваши изображения на других сайтах.
Вот как работает данный набор правил:
RewriteEngine on - включаем механизм mod_rewrite
RewriteCond %{HTTP_REFERER} !^$ - RewriteCond является еще одной директивой mod_rewrite. Она позволяет устанавливать условие, которое должно выполняться для обработки URL следующим за ним правилом RewriteRule . В данном случае условием является наличие значения в переменной HTTP_REFERER.
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC] - вторая директива RewriteCond  требует, чтобы значение переменной HTTP_REFERER не начиналось с http://www.example.com/ или http://example.com/ . Флаг [NC] устанавливает чувствительность к регистру символов.
RewriteRule .+\.(gif|jpg|png)$ - [F] - если два выше предыдущих условия RewriteCond не выполняются, то правило пропускается. Само же правило возвращает ошибку "403 Forbidden" (используется флаг [F]), если URL содержит имя файла изображения (строка заканчивается на .gif, .jpg или .png), Тире в параметре подстановки означает "не надо заменять URL другим адресом".
То есть весь набор правил в файле .htaccess гласит, если переменная HTTP_REFERER содержит значение, и оно не начинается на http://example.com/ или http://www.example.com/, и запрашиваемый URL содержит имя файла изображения, то надо отказать запросу с ошибкой "403 Forbidden".