Redirection 3xx. Редиректы

Что такое редирект?

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

300 редирект - множественный выбор

300 Multiple Choices

Множественный выбор (Multiple Choices) - это вид редиректа, который применяется для автоматического (или в некоторых случаях - ручного) принятия решения браузером: какой именно документ показать пользователю, в зависимости от предпочтений конкретного пользователя.

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

Как это работает?

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

Но вот вдруг этот пользователь запрашивает страницу сайта, и в ответ получает 300-й код редиректа вместе со списком характеристик и адресов, на которые следует перейти.

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

301 редирект - перемещен навсегда

301 Moved Permanently

Перемещен навсегда (Moved Permanently). Редирект сообщает браузеру и поисковой машине о том, что запрошенный адрес страницы не существует. И навсегда перемещен по новому адресу, который указывается в заголовке после Location, где его впредь и следует искать.

Используется для так называемой склейки как отдельных страниц, так и доменов.

Как это работает?

Браузер клиента (или поисковая машина), при запросе некоторого адреса, вдруг получает в ответ 301 Moved Permanently.

В идущих за данным ответом служебных заголовках ищется такой, который начинается на "Location:", и загружается страничка с новым адресом, указанным после двоеточия.

Данный редирект кэшируется.

302 редирект - документ найден

302 Found, 302 Moved Temporarily

Документ найден (Found). Данный редирект является временным. Используется для того, чтобы дать знать пользователям и поисковикам о том, что запрошенная страница временно недоступна.

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

Как это работает?

При использовании 302-го редиректа браузер (или поисковик) обязаны перейти по адресу, указанному в заголовке Location, но при этом учесть, что новый адрес все таки временный, и в дальнейшем, скорее всего, содержимое страницы будет другим.

Кэширование производится только в случае наличия заголовка Cache-Control или Expires.

303 редирект - смотри другое

303 See Other

Смотри другое (See Other) - это специальный редирект, который говорит о том, что запрошенный документ найден. Но на него следует перейти используя метод GET, вне зависимости от того метода, каким был запрошен исходный документ.

Данный редирект был введен вместе с 307 для устранения неоднозначности c 302 редиректом: нужно ли менять метод запроса документа (GET, POST, HEAD - 303 редирект), или нет - 307 редирект.

Где это используется?

303 редирект используется достаточно редко.

Например, в случае поиска по сайту, был найден всего один документ. В этом случае, вместо того, чтобы показать в результатах поиска этот единственный документ, можно отдать пользователю 303 редирект, а найденный документ указать в заголовке Location - тогда пользователь сразу увидит искомое, без просмотра результата поиска.

Данный редирект запрещен к кэшированию.

304 редирект - не изменялось

304 Not Modified

Не изменялось - сервер возвращает такой код, если клиент запросил документ методом GET, использовал заголовок If-Modified-Since или If-None-Match и документ не изменился с указанного момента. При этом сообщение сервера не должно содержать тела. Появился в HTTP/1.0.

Как это работает?

Браузер запросил документ, и передал вместе с запросом временные или иные метки в заголовках Last-Modified или ETag.

При следующем обращении браузера к этой странице, он должен передать эти метки в заголовках If-Modified-Since и If-None-Match соответственно.

Если документ не изменился с прошлого запроса, сервер вместо страницы документа, выдает в ответ 304 редирект.

Браузер берет из своего локального кеша страницу, сохраненную при прошлом запросе, и показывает ее пользователю.

305 редирект - используй прокси

305 Use Proxy

Используй прокси (Use Proxy) - данный редирект означает, что доступ к этой странице или сайту возможен только через прокси, адрес которого передается в заголовке Location.

Как это работает?

Браузер запрашивает страницу.

В ответ сервер выдает 305 редирект, и в заголовке Location передает адрес прокси-сервера.

Браузер повторяет запрос к этой же странице, но уже с использованием указанного прокси.

306 - не используется

306 (Unused)

306 редирект на данный момент не используется.

Он использовался в прошлых реализациях http-протокола, и на данный момент зарезервирован для дальнейшего использования. Упомянут в RFC 2616 (обновление HTTP/1.1).

307 - временный редирект

307 Temporary Redirect

Временный редирект (Temporary Redirect) означает, что необходимо запросить документ, переданный в заголовке Location тем же методом (GET, POST, HEAD), что и исходный документ.

Данный редирект был введен вместе с 303 для устранения неоднозначности c 302: стоит ли менять метод запроса документа (GET, POST, HEAD - 303 редирект), или нет - 307 редирект.

Как это работает?

Браузер или робот поисковой системы запрашивает

Данный редирект временный. Кэширование следует производить только в случае наличия в ответе сервера заголовков Cache-Control или Expires.

Как сделать редирект?

Делаем редирект на php

В php есть замечательная функция header(), которая разрешает не только подменять стандартные заголовки, но и добавлять новые.

void header ( string string [, bool replace = true [, int http_response_code]] );

Первый параметр string - полностью сформированная строка заголовка, который необходимо добавить (без завершающего перевода строки "\n")

Второй параметр replace указывает, нужно ли заменять заголовки с одинаковыми именами (true), или же добавлять в конец (false).

Параметр http_response_code указывает код http-ответа (300, 301, 302 и т.д.).

Пример редиректа на php

header( 'Location: http://yandex.ru/yandsearch?text=redirect', true, 301 );

Делаем редирект в .htaccess

Для осуществления редиректа в .htaccess, можно использовать любую из трех директив Apache (Апач, httpd): Redirect, RedirectMatch, либо RewriteRule (при включенном RewriteEngine).

Redirect [status] URL-path URL-to-redirect

Необязательный параметр status - это три цифры - код редиректа (например, 301). Если не указан, то по умолчанию подставляется 302.

URL-path - часть запрашиваемого пользователем (или поисковиком) адреса, которая должна обязательно начинаться со слеша (/).

URL-to-redirect - полный адрес сайта (и, возможно, часть пути), на который будет осуществляться редирект. Должен быть вида http: //site.ru/ - то есть обязательно должен присутствовать протокол (http://) и закрывающий адрес сайта слеш (/).

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

Если URL-path заканчивается слешем, то редирект сработает не только для указанного адреса, но и для всех, которые начинаются на указанный. А к URL-to-redirect будет добавлена часть адреса, следующая за последним указанным слешем в URL-path.

Пример

Redirect 301 /hello.html http://google.ru/search?q=bye

Делаем редирект на html

Это особый вид редиректа. Так как он располагается в заголовке html-документа, то страница, на которой он расположен, с одной стороны является полноценной страницей - на най может присутствовать текст, картинки и т.д. А с другой - это редирект, который срабатывает через несколько секунд (или сразу же, если указать задержку в 0 секунд).

<meta http-equiv="refresh" content="seconds;URL-to-redirect">

Первый параметр seconds - это количество секунд (после полной загрузки страницы), по истечении которых произойдет редирект на второй параметр URL-to-redirect.

Пример

Данный редирект должен располагаться в секции <head> html-документа, таким образом:
<head>
    <meta http-equiv="refresh" content="seconds; URL-to-redirect">
</head>
<body>
    текст страницы
</body>

Редирект при помощи javascript

Редирект, написанный на яваскрипт (или же джаваскрипт - как кому больше нравится), хотя и не отдает 3xx редирект, но все же позволяет переадресовывать пользователей на нужную страницу.

Такой редирект часто используют для "обмана" поисковых систем: так как javascript обрабатывается только в браузере пользователя, но не обрабатывается поисковыми пауками. На сегодняшний день это утверждение справедливо для всех поисковиков, кроме гугла: Google успешно распознает многие редиректы, написанные с помощью яваскрипт.

<script type="text/javascript">
    location="http://yandex.ru";
    document.location.href = "http://yandex.ru";
    location.replace("http://yandex.ru");
    window.location.reload("http://yandex.ru");
    document.location.replace("http://yandex.ru");
</script>

  1. PHP
  2. Редиректы
  3. Примеры