php - regresar - Impedir que el botón Atrás muestre la alerta de confirmación POST
mostrar mensaje despues de enviar formulario php (6)
Tengo una aplicación que proporciona una larga lista de parámetros para una página web, así que tengo que usar POST en lugar de GET. El problema es que cuando se muestra la página y el usuario hace clic en el botón Atrás, Firefox muestra una advertencia:
Para mostrar esta página, Firefox debe enviar información que repita cualquier acción (como una búsqueda o confirmación de pedido) que se haya realizado anteriormente.
Dado que la aplicación está construida de tal manera que volver es una operación bastante común, esto es realmente molesto para los usuarios finales.
Básicamente, me gustaría hacerlo de la manera en que lo hace esta página:
Ingrese algo, envíe y haga clic en el botón Atrás. Sin advertencia, solo regresa.
Googleando descubrí que esto podría ser un error en Firefox 3, pero me gustaría obtener este comportamiento incluso después de que lo "arreglaron".
Supongo que podría ser factible con algunos encabezados HTTP, pero ¿con exactitud?
Tengo una aplicación que proporciona una larga lista de parámetros para una página web, así que tengo que usar POST en lugar de GET. El problema es que cuando se muestra la página y el usuario hace clic en el botón Atrás, Firefox muestra una advertencia:
Tu razonamiento es incorrecto Si la solicitud no tiene efectos secundarios, se debe OBTENER. Si tiene efectos secundarios, debe ser POST. La elección no debe basarse en la cantidad de parámetros que debe aprobar.
Como otra solución, puede detenerse para utilizar el redireccionamiento.
Puede procesar y representar el resultado de procesamiento de una vez sin alerta de confirmación POST
. Solo debes manipular el objeto del historial del navegador:
history.replaceState("", "", "/the/result/page")
Ver respuestas full o short
He estado usando la variable Session para ayudar en esta situación. Este es el método que uso que me ha funcionado de maravilla durante años:
//If there''s something in the POST, move it to the session and then redirect right back to where we are
if ($_POST) {
$_SESSION[''POST'']=$_POST;
redirect($_SERVER["REQUEST_URI"]);
}
//If there''s something in the SESSION POST, move it back to the POST and clear the SESSION POST
if ($_SESSION[''POST'']) {
$_POST=$_SESSION[''POST''];
unset($_SESSION[''POST'']);
}
Técnicamente, ni siquiera necesita volver a colocarlo en una variable llamada $ _POST. Pero me ayuda a hacer un seguimiento de qué datos provienen de dónde.
Una forma de evitar esa advertencia / comportamiento es hacer el POST a través de AJAX, luego enviar al usuario a otra página (o no) por separado.
Una forma de hacerlo es redirigir el POST a una página que redirige a un GET - vea Publicar / Redirigir / Get on wikipedia .
Supongamos que su POST es 4K de datos de formulario. Es de suponer que su servidor hace algo con esa información en lugar de solo mostrarla una vez y tirarla, como guardarla en una base de datos. Siga haciendo eso, o si se trata de un gran formulario de búsqueda, cree una copia temporal en una base de datos que se depura después de unos días o en una LRU cuando se utiliza un límite de espacio. Ahora crea una representación de los datos a los que se puede acceder usando GET. Si es temporal, genere una identificación y utilícela como URL; si se trata de un conjunto permanente de datos, probablemente tenga una ID o algo que pueda usarse para la URL. En el peor de los casos, un algoritmo como los pequeños usos de url puede colapsar una gran URL a una mucho más pequeña. Redirigir el POST para OBTENER la representación de los datos.
Como nota histórica, esta técnica fue práctica establecida en 1995 .
Vea mi regla de oro de la programación web aquí:
Detener la inserción de datos en una base de datos dos veces
Dice: "Nunca respondas con un cuerpo a una solicitud POST. Siempre haga el trabajo y luego responda con un encabezado Location: para redirigir a la página actualizada para que el navegador la solicite con GET "
Si el navegador alguna vez le pregunta al usuario acerca de la re-POST, su aplicación web está rota. El usuario no debería ver esta pregunta.