HTTP перенаправление: 301 (постоянный) против 302 (временный)

381

Должен ли клиент вести себя по-другому? Как?

ЭЛЕКТРОДИСТАНЦИОННАЯ СИСТЕМА УПРАВЛЕНИЯ
источник
RFC 2616 - коды состояния HTTP. Я мог бы повторить все, что там есть, но в нем говорится об этом совершенно ясно;)
Tiemen
2
Стоит отметить, что спецификация также предоставляет 303 и 307 кодов состояния для более тонких временных перенаправлений.
Патрик МакЭлхани
303 и 307 больше не нужны. Предполагалось, что 303 указывает, что новый URL-адрес связан, но не эквивалентен, и должен загружаться с помощью GET, даже если текущий запрос был POST, но в любом случае браузеры также делают это с 302. Предполагалось, что 307 явно указывает, что перенаправление является временным, в отличие от 302, в котором не указывалось, было ли оно временным, но браузеры и сканеры все равно воспринимают 302 как временное.
Томасруттер

Ответы:

569

Статус 301 означает, что ресурс (страница) постоянно перемещен в новое местоположение. Клиент / браузер не должен пытаться запросить исходное местоположение, а теперь использовать новое местоположение.

Статус 302 означает, что ресурс временно находится где-то еще, и клиент / браузер должен продолжать запрашивать исходный URL.

Филипп Лейбер
источник
12
Спасибо. Означает ли это, что если я использую 301 (постоянное) перенаправление, клиент может решить никогда больше не получать старое местоположение и вместо этого всегда использовать непосредственно новый URL?
flybywire
18
Точно! На самом деле, согласно спецификациям, клиент ДОЛЖЕН всегда переходить на новое место.
Филипп Лейберт
7
Но в браузере, как это влияет? Например, переписать историю в кнопке «Назад», чтобы не вернуться к неправильному в 301? Молча изменить закладку на 301, если вы нажмете на старую?
Хави Монтеро
9
@XaviMontero Большинство современных браузеров кэшируют 301-е и не будут запрашивать исходный код вообще до 6 месяцев
Jon
34
Хитрость для запоминания HTTP-коды состояния 301-> Perm и 302-> Temp Redirect Two начинается с T, так же, как временный начинается с T.
ScottCate
108

Когда паук поисковой системы находит код состояния 301 в заголовке ответа веб-страницы, он понимает, что эта веб-страница больше не существует, он ищет заголовок местоположения в ответе, выбирает новый URL-адрес и заменяет проиндексированный URL-адрес новым, а также передает pagerank ,

Таким образом, поисковая система обновляет все проиндексированные URL-адреса, которые больше не существуют (найдено 301), с помощью нового URL-адреса, при этом трафик вашей старой веб-страницы будет сохранен, PageRank и перенаправлен на новый (вы не потеряете трафик старой веб-страницы).

Браузер: если браузер находит код состояния 301, он кэширует сопоставление старого URL-адреса с новым URL-адресом, клиент / браузер не будет пытаться запросить исходное местоположение, а с этого момента будет использовать новое местоположение, пока кэш не будет очищен.

введите описание изображения здесь

Когда паук поисковой системы находит статус 302 для веб-страницы, он только временно перенаправляет на новое место и сканирует обе страницы. Старый URL веб-страницы все еще существует в базе данных поисковой системы, и он всегда пытается запросить старое местоположение и сканировать его. Клиент / браузер все равно будет пытаться запросить исходное местоположение.

введите описание изображения здесь

Узнайте больше о том, как реализовать это в asp.net c # и как это повлияет на поисковые системы - http://www.dotnetbull.com/2013/08/301-permanent-vs-302-teilitary-status-code-aspnet -csharp-Implementation.html

Рохит
источник
35

Преимущественно 301 против 302 важен для индексации в поисковых системах, так как их сканеры учитывают это и передают PageRank при использовании 301.

См . Ответ Питера Ли для более подробной информации.

отстой
источник
20

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

302 заключается в том, что запрошенный ресурс временно находится под другим URI.

Поскольку перенаправление может иногда изменяться, клиент должен продолжать использовать Request-URI для будущих запросов.

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

Питер Ли
источник
1
Так что 301 имеет смысл, но мне трудно придумать хороший пример использования 302 .
Боб Стейн
4
@ BobStein-VisiBone, например, перенаправление 302: создайте файл old.php с кодом <?php header("location: http://example.com/new.php"); ?>и файл new.php - <?php echo 'I am new'; ?>и перейдите по ссылке . Там будет перенаправить и отобразить текст «Я новичок». Затем замените код в old.php на <?php echo 'I am old'; ?>и также перейдите по ссылке . Вы увидите текст «Я старый». Если вы выполнили редирект 301 в old.php, вы бы увидели текст «Я новичок» даже после изменений в коде old.php.
Апостол
2
@ BobStein-VisiBone У меня есть страница, которая устарела и не может быть показана. Нам нужно создать новую страницу, но пока мы не будем готовы. Мы используем временное перенаправление на существующую страницу, что нам полезно для посетителей. После создания новой страницы мы будем использовать постоянное перенаправление на нее.
EddieC
4
302 полезно, если ваш целевой URL зависит от состояния.
Брайан
7
Я сейчас уже давно, но вот хороший пример. У webcomics обычно есть URL, который приводит к последнему комиксу. Если это webcomic.com/latestи перенаправляет на webcomic.com/some-comic-title301, браузер всегда будет перенаправлять на «some-comic-title». Даже когда следующий комикс был опубликован, а «последний» теперь перенаправляет на «еще один комикс-заголовок» ... Вот где 302 будет лучше.
Хсан
17

301 перенаправления кэшируются на неопределенный срок (по крайней мере, некоторые браузеры).

Это означает, что, если вы настроите 301, посетите эту страницу, вы не только будете перенаправлены, но и перенаправлены в кеширование.

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

Единственный способ отменить 301 для посетителя с таким перенаправлением в Cache - это перенаправить обратно на исходный URL **. В этом случае браузер заметит цикл и, наконец, действительно запросит введенный URL.

Очевидно, что это не вариант, если вы решили 301 на Facebook или любой другой ресурс, который вы не полностью под контролем.

К сожалению, многие провайдеры хостинга предлагают в своем интерфейсе администратора функцию, называемую «перенаправление», которая выполняет перенаправление 301. Если вы используете это для временного перенаправления вашего домена на Facebook в качестве страницы, которая скоро появится, вы, по сути, облажались.

* По крайней мере, Chrome и Firefox, согласно Как долго браузеры кешируют HTTP 301? , Только что попробовал с Chrome 45. Редактировать: Safari 7.0.6 на Mac также кеширует, перезапуск браузера не помог (Ссылка говорит, что на Safari 5 на Windows это помогает.)

** Я попробовал javascript window.location = '', потому что это было бы решением, которое можно было бы применить в большинстве случаев - оно не работает. Это приводит к необнаруженной бесконечной петле. Тем header('Location: new.url')не менее, PHP разорвать петлю

Итог: используйте 301, только если вы абсолютно уверены, что никогда не будете использовать этот URL снова. Обычно никогда не в корневом каталоге (example.com/)

Себастьян Шмид
источник
7

Основная проблема с 301 - браузер будет кэшировать перенаправление, даже если вы отключили перенаправление с уровня сервера.

Всегда лучше использовать 302, если вы включаете перенаправление для короткого окна обслуживания.

Джобин Джозеф
источник
Это определенно не «проблема»; это просто, как это должно работать. Перенаправление HTTP на HTTPS, перенаправление заброшенного веб-сайта на новый и т. Д. - это обычное использование 301.
HosseyNJF