Какой правильный код ответа HTTP для перенаправления?

Когда веб-сервер хочет перенаправить браузер пользователя, какой код состояния (например, «200 OK») он должен поместить в заголовок ответа? Насколько я знаю, ответом может быть любой из кодов 3XX, но каждый из этих кодов имеет свое описание. Имеет ли значение, что используется, если "Location" находится в заголовке ответа?


person Mike    schedule 02.07.2011    source источник


Ответы (4)


Чтобы избавить меня от лишнего набора текста - прочтите это и this.

NB - не все коды 3xx выполняют переадресацию. Но семантика 301, 302, 303 и 307 похожа.

person symcbean    schedule 05.07.2011

Это полностью зависит от того, почему вы делаете перенаправление. Я предполагаю, что вы прочитали 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. Мех.

person tc.    schedule 02.07.2011
comment
Спасибо за это. Но я все еще не понимаю, почему вы сказали, что 302 устарел ранее. - person Mike; 02.07.2011
comment
Скорее просто использовать 302 неправильно в ответ на запрос POST, если вас не устраивает возможность того, что разные браузеры интерпретируют его по-разному. - person tc.; 02.07.2011
comment
Итак, вы жалуетесь, что 302 устарел в других ответах, а затем возвращаетесь с ответом, который в основном рекомендует использовать 302 для совместимости? - person aroth; 02.07.2011
comment
Если вас не устраивает 302, используйте один из двух кодов, на которые он был заменен (303 или 307). - person Julian Reschke; 02.07.2011

Согласно документам Mozilla:

Ответы на перенаправление (в форме 3xx) указывают на то, что ресурс, запрошенный клиентом, перемещен и сервер не может обслуживать его напрямую. Большинство этих ответов содержат некоторую информацию о местоположении, указывающую, где найти запрошенный ресурс; Затем пользовательские агенты часто извлекают его без дальнейшего взаимодействия с пользователем. Наиболее частыми ответами этого типа являются 301 Moved Permanently, что указывает на то, что указанный URI не более действителен и был перемещен в другое место, а 302 Found, что указывает на то, что ресурс временно перемещен в другое место.

Примечание. Для веб-мастеров рекомендуется создать 301 Moved Permanently < / a> перенаправление при перемещении страниц на другой URI, например, во время реорганизации сайта. Это позволяет пользователям, переходящим по ссылкам, по-прежнему достигать ресурса, а также учит поисковые системы и другие службы новому местонахождению ресурса, чтобы они могли передавать на него свои метаданные. Также важно добавить соответствующие заголовки кеша в ответ 301 Moved Permanently, чтобы эта информация кэшируется клиентом и не позволяет ему делать ненужные запросы к исходному URI до получения самого ресурса.

Более подробную информацию о кодах состояния можно найти в W3C. Для визуального представления того, как различные коды состояния влияют на SEO, см. Руководство по поисковой оптимизации HTTP по статусу. Коды.

person Community    schedule 02.07.2011
comment
Хорошая ссылка, но она не совсем прояснила для меня разницу между 301/302. - person Mike; 02.07.2011
comment
@tc 302 - устаревший источник? - person Mike; 02.07.2011
comment
Проблема, с которой я столкнулся с 301, заключается в том, что если перенаправляемый URI является динамическим? Это предполагает, что пользовательский агент будет думать, что URI может быть тем же самым при каждом последующем посещении, и не беспокоиться о выполнении второго запроса. Он кэширует URI при первом посещении и больше не утруждает себя поиском. - person Mike; 02.07.2011
comment
@Mike - Если URI, перенаправляемый на, является динамическим, тогда вы в безопасности. Но если URI, который вы пересылаете из, является динамическим, вам, вероятно, лучше использовать код 302/307, чтобы гарантировать, что браузер по-прежнему направляет последующие запросы на динамический URI. - person aroth; 02.07.2011

Код ответа 302. Или, по крайней мере, это то, что HttpServletResponse Java отправляет, когда вы вызываете sendRedirect(). И если Java делает это именно так, вероятно, этому есть причина.

Единственная разница между 301 и 302 семантически состоит в том, что 301 указывает «постоянное перенаправление», а 302 указывает «временное перенаправление». Приведет ли это к каким-либо различиям на практике - полностью зависит от клиента, реализующего протокол.

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

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

person aroth    schedule 02.07.2011
comment
вы все еще не предоставили источник - person Mike; 02.07.2011