- Redirection 3xx. Редиректы
- 300 редирект — множественный выбор
- Как это работает?
- 301 редирект — перемещен навсегда
- Как это работает?
- 302 редирект — документ найден
- Как это работает?
- 303 редирект — смотри другое
- Где это используется?
- 304 редирект — не изменялось
- Как это работает?
- 305 редирект — используй прокси
- Как это работает?
- 306 — не используется
- 307 — временный редирект
- Как это работает?
- Как сделать редирект?
- Делаем редирект на php
- Пример редиректа на php
- Делаем редирект в .htaccess
- Пример
- Делаем редирект на html
- Пример
- Редирект при помощи javascript
- Как сделать редирект PHP
Redirection 3xx. Редиректы
Редирект (или перенаправление, переадресация, форвардинг) — это способ, который позволяет один и тот же документ сделать доступным с других адресов (URL’ов).
300 редирект — множественный выбор
Множественный выбор (Multiple Choices) — это вид редиректа, который применяется для автоматического (или в некоторых случаях — ручного) принятия решения браузером: какой именно документ показать пользователю, в зависимости от предпочтений конкретного пользователя.
Как правило, эти предпочтения сводятся к двум вариантам: выбор нужного языка или подходящей кодировки. Поскольку современные браузеры понимают и правильно отображают практически любую кодировку, то использование 300-го редиректа фактически сводится к автоматическому выбору языка.
Как это работает?
Пользователь настраивает свой браузер, указывая предпочитаемый им язык и кодировку, и спокойно гуляет по сети.
Но вот вдруг этот пользователь запрашивает страницу сайта, и в ответ получает 300-й код редиректа вместе со списком характеристик и адресов, на которые следует перейти.
В случае совпадения характеристики, браузер, исходя из предварительных настроек, автоматически переходит на наиболее подходящий пользователю адрес.
301 редирект — перемещен навсегда
Перемещен навсегда (Moved Permanently). Редирект сообщает браузеру и поисковой машине о том, что запрошенный адрес страницы не существует. И навсегда перемещен по новому адресу, который указывается в заголовке после Location, где его впредь и следует искать.
Используется для так называемой склейки как отдельных страниц, так и доменов.
Как это работает?
Браузер клиента (или поисковая машина), при запросе некоторого адреса, вдруг получает в ответ 301 Moved Permanently.
В идущих за данным ответом служебных заголовках ищется такой, который начинается на «Location:», и загружается страничка с новым адресом, указанным после двоеточия.
Данный редирект кэшируется.
302 редирект — документ найден
302 Found, 302 Moved Temporarily
Документ найден (Found). Данный редирект является временным. Используется для того, чтобы дать знать пользователям и поисковикам о том, что запрошенная страница временно недоступна.
Зачастую используется при проведении каких-либо технических работ над сайтом, или его частью: при обновлении движка, оптимизации базы данных, а также порядочными хостерами в случае несвоевременной оплаты за хостинг.
Как это работает?
При использовании 302-го редиректа браузер (или поисковик) обязаны перейти по адресу, указанному в заголовке Location, но при этом учесть, что новый адрес все таки временный, и в дальнейшем, скорее всего, содержимое страницы будет другим.
Кэширование производится только в случае наличия заголовка Cache-Control или Expires.
303 редирект — смотри другое
Смотри другое (See Other) — это специальный редирект, который говорит о том, что запрошенный документ найден. Но на него следует перейти используя метод GET, вне зависимости от того метода, каким был запрошен исходный документ.
Данный редирект был введен вместе с 307 для устранения неоднозначности c 302 редиректом: нужно ли менять метод запроса документа (GET, POST, HEAD — 303 редирект), или нет — 307 редирект.
Где это используется?
303 редирект используется достаточно редко.
Например, в случае поиска по сайту, был найден всего один документ. В этом случае, вместо того, чтобы показать в результатах поиска этот единственный документ, можно отдать пользователю 303 редирект, а найденный документ указать в заголовке Location — тогда пользователь сразу увидит искомое, без просмотра результата поиска.
Данный редирект запрещен к кэшированию.
304 редирект — не изменялось
Не изменялось — сервер возвращает такой код, если клиент запросил документ методом GET, использовал заголовок If-Modified-Since или If-None-Match и документ не изменился с указанного момента. При этом сообщение сервера не должно содержать тела. Появился в HTTP/1.0.
Как это работает?
Браузер запросил документ, и передал вместе с запросом временные или иные метки в заголовках Last-Modified или ETag.
При следующем обращении браузера к этой странице, он должен передать эти метки в заголовках If-Modified-Since и If-None-Match соответственно.
Если документ не изменился с прошлого запроса, сервер вместо страницы документа, выдает в ответ 304 редирект.
Браузер берет из своего локального кеша страницу, сохраненную при прошлом запросе, и показывает ее пользователю.
305 редирект — используй прокси
Используй прокси (Use Proxy) — данный редирект означает, что доступ к этой странице или сайту возможен только через прокси, адрес которого передается в заголовке Location.
Как это работает?
Браузер запрашивает страницу.
В ответ сервер выдает 305 редирект, и в заголовке Location передает адрес прокси-сервера.
Браузер повторяет запрос к этой же странице, но уже с использованием указанного прокси.
306 — не используется
306 редирект на данный момент не используется.
Он использовался в прошлых реализациях http-протокола, и на данный момент зарезервирован для дальнейшего использования. Упомянут в RFC 2616 (обновление HTTP/1.1).
307 — временный редирект
Временный редирект (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 секунд).
Первый параметр seconds — это количество секунд (после полной загрузки страницы), по истечении которых произойдет редирект на второй параметр URL-to-redirect.
Пример
Редирект при помощи javascript
Редирект, написанный на яваскрипт (или же джаваскрипт — как кому больше нравится), хотя и не отдает 3xx редирект, но все же позволяет переадресовывать пользователей на нужную страницу.
Такой редирект часто используют для «обмана» поисковых систем: так как javascript обрабатывается только в браузере пользователя, но не обрабатывается поисковыми пауками. На сегодняшний день это утверждение справедливо для всех поисковиков, кроме гугла: Google успешно распознает многие редиректы, написанные с помощью яваскрипт.
Как сделать редирект PHP
На страницах сайтов постоянно что-то добавляется, удаляется и обновляется, чтобы в поисковиках была только актуальная информация и нужные страницы не выпадали из поиска применяются редиректы. Также редиректы используются после отправки форм чтобы не было возможности отправить форму несколько раз.
- 301 – текущая страница удалена на всегда, заменой старой считать новый URL.
- 302 – текущая страница временно не доступна, заменой считать пока новый URL.
- 303 – используется после отправки формы методом POST (подробнее Post/Redirect/Get — PRG).
Итак, сделать 301-й редирект можно так:
header('Location: https://example.com', true, 301); exit();
Но функция header() не сработает если до ее вызова в браузер уже выводился какой-то контент и вызовет ошибку:
Warning: Cannot modify header information — headers already sent by…
Исправить ее можно использовав буферизацию вывода добавив в самое начало скрипта ob_start() ;
Также можно подстраховаться добавив JS-редирект и ссылку если функция header() не сработает.
Упростить использование кода можно выделив его в отдельную функцию:
function redirect($url, $code = 301) < header('Location: ' . $url, true, $code); echo ""; echo 'Перенаправление… Перейдите по ссылке.'; exit(); > /* В index.php */ if ($_SERVER['REQUEST_URI'] == '/url-old') < redirect('https://example.com/url-new'); >
$urls = array( array('/url-old-1', 'https://example.com/url-new-1'), array('/url-old-2', 'https://example.com/url-new-2'), array('/url-old-3', 'https://example.com/url-new-3'), ); foreach ($urls as $row) < if ($_SERVER['REQUEST_URI'] == $row[0]) < redirect($row[1]); >>