Каково правильное поведение, ожидаемое от HTTP POST => 302, перенаправление на GET?

Какое правильное поведение ожидается при отправке POST = > 302 в GET?

В chrome (и, скорее всего, в большинстве браузеров) после я POST (для ресурса, который хочет, чтобы я перенаправлял), и я получаю перенаправление 302, браузер автоматически выдает GET в местоположении 302. Это даже известный шаблон. Но, как я читал спецификацию, кажется, что это не должно происходить.

Спецификация HTTP говорит

Если код статуса 302 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлятьзапросить , если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых был отправлен запрос.

И скрипач показывает:

REQUEST 1: POST URLA
RESPONSE 1: 302 redirect to URLB
REQUEST 2: GET URLB

В приведенном выше разделе говорится, что браузер не должен делать запрос GET? Что мне не хватает?

  • Что-то раньше в спецификации, которая делает этот раздел неуместным
  • Мое понимание автоматического перенаправления неверно (и браузер Chrome, который сделал GET, на самом деле не перенаправлялся автоматически)
  • Мое понимание подтвердило это как пользователя
  • Что-то еще?

Ответ 1

Начинается следующая строка в спецификации:

Примечание. RFC 1945 и RFC 2068 указывают, что клиент не разрешен       для изменения метода по перенаправленному запросу. Однако большинство       существующие реализации агента пользователя обрабатывают 302, как если бы это было 303       ответ, выполняющий GET в поле значения местоположения независимо от       исходного метода запроса. Коды состояния 303 и 307 имеют       был добавлен для серверов, которые хотят однозначно       ожидаемая реакция клиента.

И сразу после этого объясняется, как обрабатывать 303, и это именно то, что вы видите.


Если вы спрашиваете, почему серверы все еще используют 302 вместо 307, которые будут обрабатывать все текущие браузеры, это потому, что старые браузеры не будут обрабатывать его. Если вам интересно, почему браузеры обрабатывают 302 как 303, это связано с тем, что ожидают его старые серверы. На самом деле нет выхода из этого цикла, и, вероятно, было бы лучше, если бы HTTP просто вернул значение 302 для обозначения того, что он имел в виду, и обесценил его (для не-GET/HEAD) в пользу 307.

Ответ 3

abarnert был прав! У меня была такая же проблема с Google App Engine, но я нашел другое решение.

Моя проблема с appengine была, я сделал POST с формой в форму GOHandler на бэкэнд. Но он был выполнен следующим образом.

запрос 1: GET/formHandler → ответ 1: 302 Найдено

запрос 1: POST/formHandler → ответ 1: 302 Найдено

request 1: GET/formHandler → ответ 1: 200 Ok.

Дополнительно я получил

Нет заголовка "Access-Control-Allow-Origin" присутствует на запрошенном ресурсе

Что было проблемой CORS.

Однако решениями оказывается использование HTTP S вместо HTTP.

Тогда у вас будет

запрос: POST/formHandler → ответ: 200 Ok