Cuando recargo un sitio web creado con express, obtengo una página en blanco con Safari (no con Chrome) porque el servidor NodeJS me envía un código de estado 304.
¿Cómo solucionar esto?
Por supuesto, esto también podría ser solo un problema de Safari, pero en realidad funciona bien en todos los demás sitios web, por lo que también tiene que ser un problema en mi servidor NodeJS.
Para generar las páginas, estoy usando Jade con res.render
.
Actualización: parece que este problema se produce porque Safari envía una 'cache-control': 'max-age=0'
recarga.
Actualización 2: ahora tengo una solución alternativa, pero ¿hay una solución mejor? Solución alterna:
app.get('/:language(' + content.languageSelector + ')/:page', function (req, res)
{
// Disable caching for content files
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
// rendering stuff here…
}
Actualización 3: la parte completa del código es actualmente:
app.get('/:language(' + content.languageSelector + ')/:page', pageHandle);
function pageHandle (req, res)
{
var language = req.params.language;
var thisPage = content.getPage(req.params.page, language);
if (thisPage)
{
// Disable caching for content files
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
res.render(thisPage.file + '_' + language, {
thisPage : thisPage,
language: language,
languages: content.languages,
navigation: content.navigation,
footerNavigation: content.footerNavigation,
currentYear: new Date().getFullYear()
});
}
else
{
error404Handling(req, res);
}
}
Respuestas:
Solución más sencilla:
app.disable('etag');
Solución alternativa aquí si desea más control:
http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/
fuente
Como dijiste, Safari envía una
Cache-Control: max-age=0
recarga. Express (o más específicamente, la dependencia de Express, node-fresh) considera que la caché está obsoleta cuandoCache-Control: no-cache
se reciben los encabezados, pero no hace lo mismo conCache-Control: max-age=0
. Por lo que puedo decir, probablemente debería. Pero no soy un experto en almacenamiento en caché.La solución es el cambio (lo que es actualmente) línea 37 de
node-fresh/index.js
deif (cc && cc.indexOf('no-cache') !== -1) return false;
a
if (cc && (cc.indexOf('no-cache') !== -1 || cc.indexOf('max-age=0') !== -1)) return false;
Bifurqué node-fresh y express para incluir esta solución en la
package.json
vía de mi proyectonpm
, podrías hacer lo mismo. Aquí están mis tenedores, por ejemplo:https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix
La rama safari-reload-fix se basa en la etiqueta 3.4.7.
fuente
Tuve el mismo problema en Safari y Chrome (los únicos que he probado) pero hice algo que parece funcionar, al menos no he podido reproducir el problema desde que agregué la solución. Lo que hice fue agregar una metaetiqueta al encabezado con una marca de tiempo generada. No parece correcto pero es simple :)
<meta name="304workaround" content="2013-10-24 21:17:23">
Actualizar PS Por lo que puedo decir, el problema desaparece cuando elimino mi proxy de nodo (por proxy me refiero al módulo express.vhost y http-proxy), lo cual es extraño ...
fuente
Intente utilizar la navegación privada en Safari o eliminar todo su caché / cookies.
Tuve algunos problemas similares al usar Chrome cuando el navegador pensó que tenía el sitio web en su caché pero en realidad no lo tenía.
La parte de la solicitud http que hace que el servidor responda un 304 es el etag. Parece que Safari está enviando el etag correcto sin tener el caché correspondiente.
fuente
Vieja pregunta, lo sé. No es necesario desactivar la función de caché y no es la mejor manera de gestionar el problema. Al deshabilitar la función de caché, el servidor necesita trabajar más y genera más tráfico. Además, el navegador y el dispositivo deben trabajar más, especialmente en dispositivos móviles, esto podría ser un problema.
La página vacía se puede resolver fácilmente usando la tecla Shift + botón de recarga en el navegador.
La página vacía puede ser el resultado de:
Pruebe primero la tecla Shift + botón de recarga y vea si el problema persiste y revise su código.
fuente