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>