HTTP-статус для функционального перенаправления - PullRequest
4 голосов
/ 08 ноября 2008

Прямо сейчас у нас есть веб-страницы, которые показывают элементы пользовательского интерфейса, и веб-страницы, которые просто обрабатывают отправку формы, а затем перенаправляют обратно на страницы пользовательского интерфейса. Они делают это с помощью функции header () PHP:

header("Location: /other_page.php");

Это приводит к отправке 302 найденного ответа; в соответствии со спецификацией HTTP 1.1, 302 предназначен для случаев, когда «Запрашиваемый ресурс временно находится под другим URI». [HTTP 1.1 spec]

Функционально это нормально, но не похоже, что это правильный код состояния для того, что мы делаем. Похоже, 303 («Смотрите другое») является подходящим статусом здесь, поэтому мне интересно, есть ли причина не использовать его. Мы должны были бы быть более явными в нашем использовании header (), так как нам нужно было бы указать эту строку состояния, а не просто поле Location :. Мысли?

Ответы [ 3 ]

8 голосов
/ 08 ноября 2008

Вы можете использовать любой из них, но правильный код статуса для перенаправления после публикации - 303.

Путаница имеет историческое объяснение. Первоначально 302 указывало, что браузер не должен изменять метод перенаправленного запроса. Это делает его непригодным для перенаправления после публикации, когда вы хотите, чтобы браузер отправлял запрос GET. Тем не менее, все браузеры неправильно интерпретируют спецификации и всегда выдают запрос GET. Чтобы прояснить неоднозначность HTTP / 1.1, были определены два новых кода: 303 и 307. 303, по сути, определяет де-факто интерпретацию 302, в то время как 307 определяет первоначальную спецификацию 302. Таким образом, на практике 302 и 303 взаимозаменяемы Теория 302 и 307 являются.

Если вы действительно заботитесь о совместимости, 302 безопаснее, чем 303, поскольку агенты HTTP / 1.0 могут не понимать 303, но все современные браузеры говорят на HTTP / 1.1, так что это не настоящий вопрос. Я бы порекомендовал использовать 303, так как это наиболее правильно.

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

4 голосов
/ 08 ноября 2008

Я никогда не использовал его сам ... как говорится в вашей ссылке:

Примечание: многие пользовательские агенты до HTTP / 1.1 делают не понимаю 303 статус. Когда совместимость с такими клиентами является проблемой, Вместо этого можно использовать код состояния 302, так как большинство пользовательских агентов реагируют на ответ 302, как описано здесь для 303.

Мне кажется, это достаточно веская причина для того, чтобы придерживаться 302.

FYI header () принимает дополнительные параметры, в которых вы можете установить код состояния:

header('Location: /foo.php', true, 303);

1 голос
/ 08 ноября 2008

Чтобы расширить ответ Роборга, многие браузеры понимают не больше, чем несколько из множества кодов ответов HTTP.

Примечание: если вас вообще беспокоит размещение в поисковой системе, 302 могут (предположительно) вызвать проблемы.

...