Pregunta

Tengo una página web x.php (en un área protegida por contraseña de mi sitio web) que tiene un formulario y un botón que utiliza el método POST para enviar los datos del formulario y abre x.php # abc . Esto funciona bastante bien.

Sin embargo, si los usuarios deciden volver a navegar en Internet Explorer 7, todos los campos en el x.php original se borran y todo debe ser ingresado nuevamente. No puedo guardar la información publicada en una sesión y estoy tratando de entender cómo puedo lograr que IE7 se comporte como quiero.

Busqué en la web y encontré respuestas que sugieren que el encabezado HTTP debería contener información explícita de almacenamiento en caché. Actualmente, he intentado esto:

session_name("FOO");
session_start();
header("Pragma: public");
header("Expires: Fri, 7 Nov 2008 23:00:00 GMT");
header("Cache-Control: public, max-age=3600, must-revalidate");
header("Last-Modified: Thu, 30 Oct 2008 17:00:00 GMT");

y variaciones de los mismos. Sin éxito. Mirar los encabezados devueltos con una herramienta como WireShark me muestra que Apache realmente está honrando mis encabezados.

Entonces mi pregunta es: ¿qué estoy haciendo mal?

¿Fue útil?

Solución

IE retendrá el contenido del formulario con un clic en el botón Atrás automáticamente, siempre que:

  • no ha roto el almacenamiento en caché con un pragma sin caché o similar
  • los campos de formulario en cuestión no fueron creados dinámicamente por script

Parece que tienes el caché en la mano, así que supongo que esto último puede aplicarse. (Como dice mkoeller, Firefox evita este problema si la página está en los últimos clics de retroceso manteniendo la página viva durante más tiempo que en la pantalla. Sin embargo, esto es opcional, y Firefox volverá al mismo comportamiento que IE y otros navegadores una vez que haya navegado unas páginas más adelante y haya caducado la anterior).

Si está creando sus propios campos de formulario a partir de la carga del script, entonces el navegador no tiene forma de saber que el nuevo control de entrada es & # 8216; el mismo & # 8217; como la instancia anterior, por lo que no puede completarlo con el valor enviado anteriormente. En este caso, si desea que funcione bien con el botón Atrás, debe comenzar a almacenar datos en el cliente.

Luego debe usar algún tipo de codificación de estado para que cada conjunto de datos esté vinculado a exactamente una instancia de la página, de lo contrario, pasará por varias instancias del mismo formulario o tendrá dos pestañas de navegador abiertas en el formulario a la vez confundirá severamente su script.

Y luego está comenzando a recopilar muchos datos si son formularios grandes, y si el mecanismo de almacenamiento del lado del cliente que está utilizando son cookies, puede comenzar a perder datos, ya que así como enviar una carga de tonterías innecesarias con cada solicitud HTTP. Hay otros mecanismos de almacenamiento del lado del cliente disponibles, pero son específicos del navegador.

En resumen: hacer bien las formas generadas dinámicamente es un gran dolor y probablemente sea mejor evitarlo si puedes. Tener una forma oculta en la página que un script hace visible, lo que permite a los navegadores hacer su campo para recordar la magia en lugar de darle la tarea, generalmente es mucho más fácil.

Otros consejos

Al intentar reducir aún más el problema, he encontrado la causa de mi problema. Estaba usando URLs que Apache reescribía (es decir, siempre accedía a mi página como http://foo.com/page que Apache asigna a http://foo.com /page.htm ). El uso de las URL real resolvió el problema e hizo feliz a IE7, siempre que especifique el encabezado HTTP adecuado ( Cache-Control , Expires , etc. .).

Esto es lo que hago en el código PHP para generar encabezados que parecen hacer felices a todos los navegadores con el caché:

function emitConditionalGet($timestamp)
{
    // See also http://www.mnot.net/cache_docs/
    // and code sample http://simonwillison.net/2003/Apr/23/conditionalGet/

    $gmdate_exp    = gmdate('D, d M Y H:i:s', time() + 1) . ' GMT';
    $last_modified = gmdate('D, d M Y H:i:s', $timestamp) . ' GMT';
    $etag          = '"'.md5($last_modified).'"';

    // If the client provided any of the if-modified-since or if-none-match
    // infos, take them into account:

    $if_modified_since = isset(

Al intentar reducir aún más el problema, he encontrado la causa de mi problema. Estaba usando URLs que Apache reescribía (es decir, siempre accedía a mi página como http://foo.com/page que Apache asigna a http://foo.com /page.htm ). El uso de las URL real resolvió el problema e hizo feliz a IE7, siempre que especifique el encabezado HTTP adecuado ( Cache-Control , Expires , etc. .).

Esto es lo que hago en el código PHP para generar encabezados que parecen hacer felices a todos los navegadores con el caché:

<*>SERVER['HTTP_IF_MODIFIED_SINCE']) ? stripslashes(

Al intentar reducir aún más el problema, he encontrado la causa de mi problema. Estaba usando URLs que Apache reescribía (es decir, siempre accedía a mi página como http://foo.com/page que Apache asigna a http://foo.com /page.htm ). El uso de las URL real resolvió el problema e hizo feliz a IE7, siempre que especifique el encabezado HTTP adecuado ( Cache-Control , Expires , etc. .).

Esto es lo que hago en el código PHP para generar encabezados que parecen hacer felices a todos los navegadores con el caché:

<*>SERVER['HTTP_IF_MODIFIED_SINCE']) : false; $if_none_match = isset(

Al intentar reducir aún más el problema, he encontrado la causa de mi problema. Estaba usando URLs que Apache reescribía (es decir, siempre accedía a mi página como http://foo.com/page que Apache asigna a http://foo.com /page.htm ). El uso de las URL real resolvió el problema e hizo feliz a IE7, siempre que especifique el encabezado HTTP adecuado ( Cache-Control , Expires , etc. .).

Esto es lo que hago en el código PHP para generar encabezados que parecen hacer felices a todos los navegadores con el caché:

<*>SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes(

Al intentar reducir aún más el problema, he encontrado la causa de mi problema. Estaba usando URLs que Apache reescribía (es decir, siempre accedía a mi página como http://foo.com/page que Apache asigna a http://foo.com /page.htm ). El uso de las URL real resolvió el problema e hizo feliz a IE7, siempre que especifique el encabezado HTTP adecuado ( Cache-Control , Expires , etc. .).

Esto es lo que hago en el código PHP para generar encabezados que parecen hacer felices a todos los navegadores con el caché:

<*>SERVER['HTTP_IF_NONE_MATCH']) : false; if (!$if_modified_since && !$if_none_match) { return; // the client does not cache anything } if ($if_none_match && $if_none_match != $etag) { return; // ETag mismatch: the page changed! } if ($if_modified_since && $if_modified_since != $last_modified) { return; // if-modified-since mismatch: the page changed! } // Nothing changed since last time client visited this page. header("HTTP/1.0 304 Not Modified"); header("Last-Modified: $last_modified"); header("ETag: $etag"); header("Cache-Control: private, max-age=1, must-revalidate"); header("Expires: $gmdate_exp"); header("Pragma: private, cache"); header("Content-Type: text/html; charset=utf-8"); exit; } function emitDefaultHeaders($timestamp) { $gmdate_exp = gmdate('D, d M Y H:i:s', time() + 1) . ' GMT'; $last_modified = gmdate('D, d M Y H:i:s', $timestamp) . ' GMT'; $etag = '"'.md5($last_modified).'"'; header("Last-Modified: $last_modified"); header("ETag: $etag"); header("Cache-Control: private, max-age=1, must-revalidate"); header("Expires: $gmdate_exp"); header("Pragma: private, cache"); header("Content-Type: text/html; charset=utf-8"); } function getTimestamp() { // Find out when this page's contents last changed; in a static system, // this would be the file time of the backing HTML/PHP page. Add your // own logic here: return filemtime($SCRIPT_FILENAME); } // ... $timestamp = getTimestamp(); emitConditionalGet($timestamp); emitDefaultHeaders($timestamp); //previously, this variable was mistyped as "$timestaml"

Firefox realiza este tipo de almacenamiento en caché. Según entiendo tu pregunta, quieres que IE7 se comporte como lo hace Firefox. Creo que eso no es posible.

Firefox e IE7 difieren en la forma en que interpretan el botón Atrás.

Firefox mostrará el árbol DOM de la página anterior como se mostró por última vez antes de que la página se abandonara. Es decir, todos los datos del formulario seguirán contenidos en el campo de entrada del formulario. Pero no verá un evento onload al presionar el botón Atrás.

IE7 volverá a mostrar la página en función de la respuesta que reciba del servidor. Por lo tanto, el formulario es vacío (a menos que el servidor haya enviado los valores predeterminados originalmente), pero verá un evento onload .

Busqué y este es un problema bastante difícil. También es un gran dolor en el culo por contenido modificado dinámicamente. Visitas la página, javascript la aumenta con tus instrucciones, vas a la página siguiente y vuelves, y javascript se ha olvidado. Y no hay forma de actualizar simplemente la página del lado del servidor, porque la página sale de la memoria caché.

Así que ideé un interruptor de caché de botón de retroceso.

Es malo y malo para la web, pero permite que las páginas se comporten como la gente espera que se comporten en lugar de deformarse mágicamente por todas partes.

<script type="text/javascript">//<!-- <![CDATA[
(function(){
    if( document.location.hash === "" )
    {
        document.location.hash="_";
    }
    else
    {
      var l = document.location;
      var myurl = ( l.protocol + "//" + l.hostname + l.pathname + l.search); 
      document.location = myurl;
    }
})();
//]]> --></script>

Esto hará un poco de magia en el sentido de que detecta si la página que estás / actualmente / viendo se cargó o no desde la caché.

si estás allí la primera vez, detectará " no hash " y agregue " #_ " a la url de la página. si está allí por > primera vez (es decir: no es un enlace directo a la página), la página ya tiene el #_, por lo que la elimina y, en el proceso de eliminación, desencadena una recarga de la página.

Puede usar autocompletar = " off " en tus campos De esta forma, los valores no serán almacenados en caché por el navegador, por lo que los valores no se completarán en el formulario cuando el usuario haga clic en el botón Atrás.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top