Para mejorar el rendimiento/capacidad de respuesta de mi sitio web, he implementado una carga de página parcial utilizando AJAX, replaceState, pushState y un escuchador de estado emergente.Botón de retroceso de API de historial HTML5 con cargas de página parcial
Básicamente, almaceno la parte central de mi página (HTML) como mi objeto de estado en el historial. Cuando se hace clic en un enlace, solicito solo el bit central de la página del servidor (identificando estas solicitudes con un encabezado Accept diferente) y lo reemplazo por javascript. En estado popstate agarro la parte central anterior y la vuelvo a empujar hacia el dom.
Esto funciona sobre todo bien, sin embargo, he encontrado un problema en particular en el que estoy atascado. Es un poco complicado de explicar, así que mis disculpas si esto no está muy claro.
Hay un formulario de búsqueda en la mayoría de nuestras páginas. La carga de página parcial a través de ajax solo se realiza en solicitudes GET, y el formulario realiza una POST que da como resultado una carga de página completa.
Si navego el siguiente conjunto de páginas, que terminan en una página parcial malformación consiste en SOLO el contenido central, sin ninguno de los dom rodea:
Inicio en la página inicial (a través de página completa carga) - realiza una búsqueda (post-redirect-get)
le lleva a los resultados de búsqueda (a través de la carga de página completa) - a continuación, haga clic en Inicio
le devuelve a la página inicial (vía get dinámico) - hacer clic atrás del navegador
Buscar Resultados (del oyente popstate): haga clic en el navegador de nuevo
página de inicio con formato incorrecto mi.
Cuando aparece la página de inicio mal formada, mi escucha de popstate no está presente en absoluto.
Lo que que está sucediendo, es que la segunda carga (dinámica, parcial) de la página de inicio se almacena en caché por el navegador, y luego, cuando se produce vuelta la página completa, el navegador es simplemente mostrando la caché parcial respuesta en lugar de la página completa.
Para tratar de remediar esto he agregado un encabezado Vary: Accept a la respuesta para que los navegadores sepan que el contenido puede cambiar según el encabezado accept. También agregué Cache-Control max-age = 0, pragma no-cache, y una fecha de caducidad pasada al contenido cargado parcialmente para intentar obligar al navegador a no almacenar en caché esto, pero nada de esto lo resuelve.
Desafortunadamente, mi empresa no permite el tráfico externo a nuestros servidores de desarrollo, por lo que no puedo mostrarle el problema. He analizado varias preguntas similares aquí, pero ninguna de ellas parece ser la misma, y las soluciones sugeridas tampoco parecen funcionar.
Si agrego un parámetro inútil (blah = blah) a mis solicitudes dinámicas GET, esto resuelve el problema. Sin embargo, este es un hack feo que prefiero no hacer. Parece que debería poder resolverse con encabezados, ya que creo que es un problema de almacenamiento en caché. ¿Alguien puede explicar lo que está pasando?
Actualización rápida: los encabezados parecen resolver el problema en Firefox, pero persiste en Chrome y iOS Safari (¿problema con el webkit?) –
Suena como un problema de almacenamiento en caché. Agregar un parámetro a las solicitudes GET dinámicas parece razonable, eso es lo que hace jquery-pjax. –