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:
- navegador envía datos a través de
POST
- servidor modifica la base de datos, responde con el estado
302 Moved Temporarily
y una cabeceraLocation
- navegador sigue la redirección a través de
GET
- 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)
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
Bueno, mirando la pestaña de red en el depurador me dice esto. El servidor también recibe un POST. – Tomalak
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. –