Какой правильный код ответа HTTP для перенаправления? - PullRequest
2 голосов
/ 02 июля 2011

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

Ответы [ 4 ]

1 голос
/ 05 июля 2011

Чтобы сэкономить мне много печатания - прочитайте это и это .

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

1 голос
/ 02 июля 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-после-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. Мех.

0 голосов
/ 02 июля 2011

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

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

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

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

0 голосов
/ 02 июля 2011

В соответствии с документация Mozilla :

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

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

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

...