2012-03-28 18 views
10

Tengo una página web que implementa el patrón publicar/redirigir/obtener para evitar publicaciones dobles en una simple aplicación CRUD.Post-Redirect-Get with Internet Explorer

La secuencia prevista de solicitud/respuesta aquí es:

  1. navegador envía datos a través de POST
  2. servidor modifica la base de datos, responde con el estado 302 Moved Temporarily y una cabecera Location
  3. navegador sigue la redirección a través de GET
  4. el servidor responde con la página actualizada

Así se supone que funciona, y lo hace, por ejemplo, en Chrome.

Internet Explorer 9, sin embargo, envía el paso 3 como POST, también (¡incluyendo el conjunto completo de datos de formulario!). ¿Por qué? ¿Qué debo hacer para que use GET?

Debo agregar que, aparte de la cadena de consulta, el redireccionamiento va a la misma ubicación que el destino del formulario.

He intentado:

  • todos disponibles de modos de renderizado (IE7, IE8, IE9, manías, normas, Compat)
  • un DOCTYPE completa
  • una URL relativa o absoluta en uno Location la cabecera
  • de estado HTTP 303 (sólo para ver si hay alguna diferencia)
+0

Funciona para mí con el ejemplo más simple posible, sin DOCTYPE en absoluto, etc. ¿Está seguro de que IE9 realmente envía una segunda solicitud POST idéntica? ¿Sin representantes o cualquier otra cosa en el medio? – Jon

+0

Bueno, mirando la pestaña de red en el depurador me dice esto. El servidor también recibe un POST. – Tomalak

+3

RFC 2616 para HTTP/1.1 estados, en la sección 10.3.3 para [definiciones de código de estado] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) que un navegador reacciona a un '302' la respuesta debería * no * cambiar el método utilizado, por lo que un POST debe permanecer como POST. IE lo está haciendo bien. Pero un '303' * debería * convertirse en un GET, por lo que IE está haciendo * ese * incorrecto, de acuerdo con su último punto. –

Respuesta

4

el código de estado correcto si desea un GET es , aunque 301 y 302 también harán lo que quieran en los navegadores comunes.

Si esto no funciona, probablemente haya otra cosa incorrecta. Un rastreo HTTP sería útil para encontrar lo que está mal.

+0

Se suministrará eso mañana. – Tomalak

3

No estoy seguro, pero parece que IE9 en realidad no envió "POST" después de redirigir 30x - simplemente lo muestra en su depurador interno.

+2

No estoy seguro si es el mismo problema que el OP, pero es muy similar (Post-Redirect-Get + IE9). Acabo de confirmar que es el depurador en mi caso. –

+0

Yo también. En el modo IE9, el panel de desarrollo de red dice POST-> POST para 303 pero el servidor dice que está recibiendo POST-> GET. :( – Ashley

2

Me di cuenta de un comportamiento similar. Resulta que el depurador interno de IE11 estaba informando un POST, pero utilizando una aplicación de terceros (Fiddler) informó que la solicitud era un GET. Si ve un mensaje POST en respuesta a un 303/302, revíselo con una aplicación externa.