respuesta que injector estado errores error códigos código codigo 4xx node.js caching safari express http-status-code-304

node.js - que - http 304



NodeJS/express: caché y código de estado 304 (4)

Cuando recargo un sitio web hecho 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 resolver 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 haber un problema en mi servidor NodeJS.

Para generar las páginas, estoy usando Jade con res.render .

Actualización: Parece que este problema ocurre porque Safari envía ''cache-control'': ''max-age=0'' al volver a cargar.

Actualización 2: ahora tengo una solución alternativa, pero ¿hay una mejor solución? Solución:

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: Entonces 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); } }


Como dijiste, Safari envía Cache-Control: max-age = 0 al volver a cargar. Express (o más específicamente, la dependencia de Express, node-fresh) considera la caché obsoleta cuando Cache-Control: no se reciben encabezados de caché, pero no hace lo mismo para Cache-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 cambiar (lo que es actualmente) la línea 37 de node-fresh / index.js de

if (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 corrección en el paquete de mi proyecto. npm vía npm , podría 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.


Intente utilizar la navegación privada en Safari o elimine todo el caché / cookies.

He tenido algunos problemas similares al usar Chrome cuando el navegador pensaba que tenía el sitio web en su caché pero en realidad no.

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.



Tuve el mismo problema en Safari y Chrome (los únicos que probé) pero simplemente 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 un Timstamp generado. No parece correcto, pero es simple :)

<meta name="304workaround" content="2013-10-24 21:17:23">

Actualización de PS Por lo que puedo decir, el problema desaparece cuando elimino mi proxy de nodo (por proxy quiero decir tanto express.vhost como el módulo http-proxy), lo cual es extraño ...