2012-03-28 1 views
10

У меня есть веб-страница, которая реализует шаблон post/redirect/get, чтобы избежать двойных сообщений в простом приложении CRUD.Post-Redirect-Get with Internet Explorer

Намеченный запрос/ответная последовательность здесь:

  1. браузер отправляет данные через POST
  2. сервер изменяет базу данных, отвечает статусу 302 Moved Temporarily и Location заголовка
  3. браузер выполняет перенаправление через GET
  4. сервер отвечает обновленной страницей

Вот как это должно работать - и это происходит, например, в Chrome.

Internet Explorer 9, однако, отправляет шаг 3 как POST, также (включая полный набор данных формы!). Зачем? Что делать, чтобы использовать его GET?

Я должен добавить, что помимо строки запроса перенаправление переходит в то же место, что и целевой объект формы.

Я пробовал:

  • все доступные режимы рендеринга (IE7, IE8, IE9, причуды, стандарты, Compat)
  • полный DOCTYPE
  • относительный URL или абсолютный один в Location заголовок
  • HTTP Status 303 (просто чтобы увидеть, если это делает никакой разницы)
+0

Работает для меня с самым простым примером, без DOCTYPE и т. Д. Вы уверены, что IE9 действительно отправляет второй идентичный запрос POST? Нет прокси или что-нибудь еще посередине? – Jon

+0

Ну, глядя на вкладку сети в отладчике, мне это говорит. Сервер также получает POST. – Tomalak

+3

RFC 2616 для HTTP/1.1 указывает, что в разделе 10.3.3 для [определения кода состояния] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) браузер, реагирующий на '302', ответ должен * не * изменять используемый метод - поэтому POST должен оставаться POST. IE действительно делает это правильно. Но '303' * должен * стать GET, поэтому IE делает *, что * неправильно, в соответствии с вашей последней точкой маркера. –

ответ

4

правильный код состояния, если вы хотите, чтобы GET , хотя 301 и 302 также будут делать то, что вы хотите, в обычных браузерах.

Если это не работает, возможно, что-то еще не так. Трассировка HTTP была бы полезной для определения того, что не так.

+0

Будет поставлять это завтра. – Tomalak

3

Я не уверен, но IE9 на самом деле не отправляет «POST» после перенаправления 30x - он просто отображает его во внутреннем отладчике.

+2

Не уверен, что это та же проблема, что и OP, но она очень похожа (Post-Redirect-Get + IE9). Я только что подтвердил, что это отладчик в моем случае. –

+0

Меня тоже. В режиме IE9 панель сетевых разработчиков сообщает POST-> POST за 303, но сервер говорит, что получает POST-> GET. :( – Ashley

2

Я заметил подобное поведение. Оказывается, внутренний отладчик IE11 сообщал POST, но с помощью стороннего приложения (Fiddler) он сообщил, что запрос является GET. Если вы видите POST в ответ на 303/302, дважды проверьте его с помощью внешнего приложения.