HTTP-перенаправления выполняются с помощью HTTP-кодов 301 и 302 (возможно, также других кодов) и поля заголовка, известного как «Location», в котором есть адрес нового места для перехода. Однако браузеры всегда отправляют запрос «GET» на этот URL.
Однако часто вам нужно перенаправить пользователя в другой домен через POST (например, банковские платежи). Это общий сценарий и действительно требование. Кто-нибудь знает, почему такое стандартное требование игнорируется в спецификации HTTP? Обходной путь - отправить форму (с параметрами в скрытых полях) с установленным действием в целевое местоположение (значение поля заголовка Location ) и использовать его setTimeout
для отправки формы в целевое местоположение.
web-development
web-applications
http
Саид Нямати
источник
источник
Ответы:
В HTTP 1.1 фактически существует код состояния ( 307 ), который указывает, что запрос должен повторяться с использованием того же метода и отправки данных .
Как уже говорили другие, здесь есть вероятность неправильного использования, поэтому многие фреймворки придерживаются 301 и 302 в своих абстракциях. Однако при правильном понимании и ответственном использовании вы сможете выполнить то, что ищете.
Обратите внимание, что в соответствии со спецификацией W3.org , когда
METHOD
нетHEAD
илиGET
, пользовательские агенты должны запросить пользователя перед повторным выполнением запроса в новом месте. Вы также должны предоставить пользователю примечание и резервный механизм на случай, если старые агенты пользователя не уверены, что делать с 307.Используя эту форму:
И если Test307.aspx просто вернет 307 с адресом Location: http://google.com , Chrome 13 и Fiddler подтвердят, что «test = the test» действительно опубликован в Google. Конечно, дальнейший ответ - 405, поскольку Google не позволяет POST, но он показывает механику.
Для получения дополнительной информации см. Список кодов состояния HTTP и спецификацию W3.org .
источник
Я нашел хорошее объяснение на этой странице здесь .
Хотя я не являюсь поклонником технических ограничений пользователей, чтобы они не вызывали нежелательный хаос и не наносили нежелательный вред их приложениям, я могу понять суть, и это имеет смысл.
источник
GET (и несколько других методов) определены как «SAFE» в спецификации http ( RFC 2616 ):
Это означает, что запрос GET никогда не должен иметь каких-либо серьезных последствий для пользователя, кроме того, что он видит то, что может не захотеть видеть, но запрос POST может изменить ресурс, который важен для него или для других людей.
Хотя это изменилось в JavaScript, традиционно существовали разные пользовательские интерфейсы - пользователи могли инициировать GET-запросы, щелкая ссылки, но для заполнения POST-запроса приходилось заполнять форму. Я думаю, что разработчики HTTP стремились поддерживать различие между безопасными и небезопасными методами.
Я также не думаю, что когда-либо нужно будет перенаправлять на POST. Любое действие, которое необходимо выполнить, можно предположительно выполнить, вызвав функцию в коде на стороне сервера, или, если это должно произойти на другом сервере, вместо того, чтобы отправлять перенаправление, содержащее URL-адрес браузера для POST, на сервер. может сделать запрос к самому серверу, действуя как прокси для пользователя.
источник