Когда веб-сервер хочет перенаправить браузер пользователя, какой код состояния (например, «200 OK») он должен поместить в заголовок ответа? Насколько я знаю, ответом может быть любой из кодов 3XX, но каждый из этих кодов имеет свое описание. Имеет ли значение, что используется, если "Location" находится в заголовке ответа?
Какой правильный код ответа HTTP для перенаправления?
Ответы (4)
Чтобы избавить меня от лишнего набора текста - прочтите это и this.
NB - не все коды 3xx выполняют переадресацию. Но семантика 301, 302, 303 и 307 похожа.
Это полностью зависит от того, почему вы делаете перенаправление. Я предполагаю, что вы прочитали RFC 2616.
Вы не хотите использовать 301, за исключением потенциально таких вещей, как переименование страниц. Я не знаю ни одной CMS, которая бы делала это автоматически.
Клиенты с возможностями редактирования ссылок должны автоматически повторно связывать ссылки на Request-URI с одной или несколькими новыми ссылками, возвращаемыми сервером, где это возможно.
302 отлично подходит для временного GET-after-GET и по умолчанию не кэшируется. Его не следует использовать для GET-after-POST, поскольку на самом деле он означает POST-after-POST (после запроса подтверждения у пользователя):
Примечание. RFC 1945 и RFC 2068 указывают, что клиенту не разрешено изменять метод перенаправленного запроса. Однако большинство существующих реализаций пользовательского агента обрабатывают 302, как если бы это был ответ 303, выполняя GET для значения поля Location независимо от исходного метода запроса. Коды состояния 303 и 307 были добавлены для серверов, которые хотят однозначно указать, какой тип реакции ожидается от клиента.
303 предназначен для GET-after-POST. Старые браузеры могут не поддерживать его, поэтому вы можете не захотеть использовать его для GET-after-GET:
Примечание. Многие пользовательские агенты до HTTP / 1.1 не понимают статус 303. Когда взаимодействие с такими клиентами вызывает беспокойство, вместо него может использоваться код состояния 302, поскольку большинство пользовательских агентов реагируют на ответ 302, как описано здесь для 303.
307 предназначен для POST-after-POST (после подтверждения пользователем). Его можно использовать для GET-after-GET, но в этом случае вы также можете использовать 302/303:
Если код состояния 307 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых запрос был выпущен.
Что касается совместимости, я не удивлюсь, если значительный процент (1%?) Пользователей находится за сломанными прокси, которые не понимают 303 или 307, даже если они утверждают, что поддерживают HTTP / 1.1. Мех.
Согласно документам Mozilla:
Ответы на перенаправление (в форме 3xx) указывают на то, что ресурс, запрошенный клиентом, перемещен и сервер не может обслуживать его напрямую. Большинство этих ответов содержат некоторую информацию о местоположении, указывающую, где найти запрошенный ресурс; Затем пользовательские агенты часто извлекают его без дальнейшего взаимодействия с пользователем. Наиболее частыми ответами этого типа являются
301 Moved Permanently
, что указывает на то, что указанный URI не более действителен и был перемещен в другое место, а302 Found
, что указывает на то, что ресурс временно перемещен в другое место.Примечание. Для веб-мастеров рекомендуется создать
301 Moved Permanently
< / a> перенаправление при перемещении страниц на другой URI, например, во время реорганизации сайта. Это позволяет пользователям, переходящим по ссылкам, по-прежнему достигать ресурса, а также учит поисковые системы и другие службы новому местонахождению ресурса, чтобы они могли передавать на него свои метаданные. Также важно добавить соответствующие заголовки кеша в ответ301 Moved Permanently
, чтобы эта информация кэшируется клиентом и не позволяет ему делать ненужные запросы к исходному URI до получения самого ресурса.
Более подробную информацию о кодах состояния можно найти в W3C. Для визуального представления того, как различные коды состояния влияют на SEO, см. Руководство по поисковой оптимизации HTTP по статусу. Коды.
Код ответа 302. Или, по крайней мере, это то, что HttpServletResponse
Java отправляет, когда вы вызываете sendRedirect()
. И если Java делает это именно так, вероятно, этому есть причина.
Единственная разница между 301 и 302 семантически состоит в том, что 301 указывает «постоянное перенаправление», а 302 указывает «временное перенаправление». Приведет ли это к каким-либо различиям на практике - полностью зависит от клиента, реализующего протокол.
Например, браузер может решить, что, поскольку 301 является постоянным, он просто запомнит возвращаемый URL-адрес перенаправления и никогда больше не будет отправлять запрос на исходный URL-адрес. Но это будет полностью зависеть от реализации браузера.
Возможно, разумным практическим правилом является то, что если вы перемещаете статический контент в новое место, всегда используйте 301. Но если вы отправляете перенаправление в ответ на запрос некоторого динамического кода на вашем сервере, вам следует использовать код 302 ( или, альтернативно, 307), чтобы гарантировать, что последующие запросы по-прежнему отправляются на исходный URL-адрес на случай, если вы когда-нибудь решите изменить / обновить свой динамический код, чтобы сделать что-то другое.