Статус HTTP для функционального перенаправления

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

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

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

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

Вы можете использовать любой из них, но правильный код состояния для перенаправления-после-сообщения – 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-адресом. На практике это не имеет значения – браузеры прощают, но если вы заботитесь о спецификациях, это правильная вещь.

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

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

Это кажется достаточно хорошим поводом для меня придерживаться 302.

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

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

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

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