вторник, 5 февраля 2013 г.

Перенаправление (редирект) в файле .htaccess

При изменении URL-адресов страниц, например, при переносе сайта на новый домен или в связи с изменением структуры сайта задается перенаправление, чтобы посетители или поисковики при попытке зайти по старым адресам, попадали на нужные страницы уже по новым адресам.

*** При смене домена нужно также сообщить поисковикам о переносе сайта. Какое-то время после переноса у вас будет два сайта с одинаковыми страницами (их называют зеркалами). В файл robots.txt, в корне сайтов на обоих доменах добавляется директива Host, которая указывает на главное зеркало сайта (Смена домена).
Кстати, при перенаправлении можно указывать код ошибки:

* 301 - документ перемещен постоянно
* 302 -перемещен временно
* 303 - смотрите другой
* 404 - не существует
* 410 - удален
Обращение к несуществующей странице: ошибка 404
Когда страница не существует, выполняется перенаправление на специальную страницу или на другой сайт, здесь - на страницу в корне сайта /errors/404.php
RewriteEngine On
ErrorDocument 404 /errors/404.php

Простое перенаправление (Redirect )

Перенаправление на другой сайт при любом обращении к данному сайту:
Redirect / http://www.mysite.ru
Если указан код ошибки 301, вы сообщаете (например, поисковикам) о том, что сайт или страницы перемещены постоянно
Изменение адреса одной страницы:
Redirect 301 /2010/01/mypage.html http://mblogm.ru/wp-content/mypage.html
Изменение адресов всех страниц из заданной папки folder1:
Redirect 301 /folder1 / http://mblogm.ru/folder2/

Перенаправление с использованием Perl-совместимых регулярных выражений

RedirectMatch

Редирект с подстановкой:
RedirectMatch Permanent (.*.gif)$  http://www.site.com/alt/path/to/gif/files$1
*** RedirectMatch Permanent - это эквивалент RedirectMatch 301

RewriteRule

RewriteRule позволяет действовать более гибко, но для его использования необходимо, чтобы в состав веб-сервера был включен модуль mod_rewrite.
Перенос всего сайта
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://studyenglishnow.ru/$1 [R=301,L]
Перенос страниц
Изменение адреса отдельных страниц в связи с изменением структуры сайта или c изменением структуры постоянных ссылок в WordPress:
Options +FollowSymLinks
RewriteEngine on
RewriteRule 2(009|010)/([0-9]{2})/(.+) http://studyenglishnow.ru/$3 [R=302,L]
*** Регулярное выражение
.+ означает "не менее одного любого символа"
(.+) - нумерованная группа символов (нумерация в порядке следования групп)
$3 - то, что найдено в 3 группе
Например, в URL-адресе http://studyenglishnow.ru/2010/01/reading/
регулярное выражение 20(09|10)/([0-9]{2})/(.+)
находит следующие группы символов:
0: (2010/01/reading/)
1: (10)
2: (01)
3: (reading/)
Поэтому получим редирект на страницу http://studyenglishnow.ru/reading/

Флаги

R (redirect) - возвращает результат браузеру клиента как редирект на заданную страницу с заданным кодом ошибки
L (last) - заданная ссылка считается окончательной
Еще флаги
F (forbidden) возвращает ошибку 403 (FORBIDDEN).
G (gone) возвращает ошибку 410 (GONE).
P (proxy) - по этому флагу Apache выполняет подзапрос (sub-request) к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy не входит в состав вашей сборки Apache, то применение данного флага вызовет ошибку.
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=переменная:значение».
В редиректе можно передавать в запросе дополнительные параметры. Применение флага QSA позволяет сохранить параметры исходного запроса, например, ссылка http://site.com/project1/news.pl?mode=daily будет преобразована в http://project1.ru/news.pl?came_from=site.comamode=daily
RewriteRule ^project1/?(.*) http://project1.ru/$1?came_from=site.com [R,QSA]
RewriteRule ^project2/?(.*) http://project2.ru/$1?came_from=site.com [R,QSA]

Условное перенаправление: RewriteCond + RewriteRule

Директива RewriteCond (их может быть несколько) проверяет выполнение заданного условия и всегда ставится непосредственно перед директивой RewriteRule. По умолчанию директивы RewriteCond объединяются лигоческим "И", поэтому, если все условия, заданные в следующих подряд директивах RewriteCond, верны, выполняется следующая за ними (только одна!) директива RewriteCond. В противном случае эта директива RewriteRule игнорируется.
Флаг OR позволяет объединять условия логическим "ИЛИ" (должны быть верным любое из заданных условий):
RewriteCond условие1 [OR]
RewriteCond условие2
RewriteRule преобразование

RewriteCond

Проверяемое выражение — это строка, которая может состоять из обычных символов, макросов и переменных. Макросы $1, $2 и так далее ссылаются на соответствующие выражения в скобках из следующей по порядку директивы RewriteRule. Макросы %1, %2 и так далее ссылаются на выражения в скобках из предыдущей по порядку директивы RewriteCond. Кстати, макросы %* могут также использоваться и в директивах RewriteRule для ссылки на предыдущую директиву RewriteCond.
Переменные записываются в виде %{ИМЯ_ПЕРЕМЕННОЙ}. Наиболее часто используются следующие переменные:
QUERY_STRING (параметры запроса),
REMOTE_ADDR (IP-адрес посетителя),
REMOTE_HOST (имя хоста посетителя),
REMOTE_USER (имя пользователя, если он прошел авторизацию),
REMOTE_METHOD (обычно GET или POST),
PATH_INFO (путь к файлу веб-страницы),
HTTP_USER_AGENT (содержимое http-заголовка User-Agent),
HTTP_REFERER (содержимое http-заголовка Referer),
HTTP_COOKIE (содержимое http-заголовка Cookie),
HTTP_HOST (имя хоста веб-сайта),
TIME_YEAR (все переменные TIME_* хранят разбитые на части текущие дату и время), TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY,
REQUEST_URI (строка запроса без имени хоста и параметров запроса),
REQUEST_FILENAME (имя файла из REQUEST_URI),
THE_REQUEST (полная строка запроса в том виде, в котором ее присылает браузер посетителя).
Помимо стандартных переменных можно проверять содержимое любого http-заголовка: %{HTTP:Название-Заголовка}.
Кроме регулярных выражений можно использовать еще несколько видов условий (условию может предшествовать символ !, который трактуется как отрицание):
=ABC — значение переменной должно быть лексически равно строке ABC;
>ABC — значение переменной должно быть лексически больше строки ABC;
-d — должен существовать каталог, имя которого совпадает со значением переменной;
-f — должен существовать файл, имя которого совпадает со значением переменной;
-s — должен существовать файл ненулевой длины, имя которого совпадает со значением переменной;
-l — должен существовать симлинк, имя которого совпадает со значением переменной;
-F— должен существовать файл, имя которого совпадает со значением переменной, и этот файл должен быть доступен по внешней ссылке на данный веб-сайт;
-U — должна быть доступна http-ссылка, имя которой совпадает со значением переменной.
Флагов всего два: OR (объединение директив RewriteCond по ИЛИ, как было написано выше) и NC (отключение проверки регистра аналогично одноименному флагу для директивы RewriteRule).
(здесь использованы цитаты с сайта pcre.ru)
Некоторые примеры из того же источника
* Если на сайте не найдена ссылка, выполняется перенаправление на www.site.ru
RewriteCond %{REQUEST_URI} !-U
RewriteRule (.*) http://www.site.ru/$1 [R]
* Закрывает доступ к веб-сайту в рабочее время
RewriteCond %{TIME_HOUR}%{TIME_MIN} >1000
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule .* - [F]
* Перенаправление на страницу с информацией о технических работах
Скрипт, который проводит оптимизацию базы данных, создает временный файл /home/site/optimizer.pid
RewriteCond /home/site/optimizer.pid -f
RewriteRule .* /optimization_message.html
Всего просмотров 615, сегодня 4
Запись опубликована в рубрике htaccess с метками , , , , , , , , , . Добавьте в закладки постоянную ссылку.

Комментариев нет:

Отправить комментарий