Lorsque je recharge un site Web réalisé avec express, j'obtiens une page vierge avec Safari (pas avec Chrome) car le serveur NodeJS m'envoie un code de statut 304.
Comment résoudre ça?
Bien sûr, cela pourrait aussi être juste un problème de Safari, mais en fait cela fonctionne bien sur tous les autres sites Web, donc cela doit aussi être un problème sur mon serveur NodeJS.
Pour générer les pages, j'utilise Jade avec res.render
.
Mise à jour: il semble que ce problème se produit car Safari envoie 'cache-control': 'max-age=0'
lors du rechargement.
Mise à jour 2: J'ai maintenant une solution de contournement, mais y a-t-il une meilleure solution? Solution de contournement:
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…
}
Mise à jour 3: La partie du code complet est donc actuellement:
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);
}
}
Réponses:
Solution la plus simple:
app.disable('etag');
Solution alternative ici si vous voulez plus de contrôle:
http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/
la source
Comme vous l'avez dit, Safari envoie
Cache-Control: max-age=0
lors du rechargement. Express (ou plus spécifiquement, la dépendance d'Express, node-fresh) considère le cache obsolète lorsque les en-Cache-Control: no-cache
têtes sont reçus, mais il ne fait pas la même chose pourCache-Control: max-age=0
. D'après ce que je peux dire, cela devrait probablement. Mais je ne suis pas un expert de la mise en cache.La solution est de changer la ligne (ce qui est actuellement) 37
node-fresh/index.js
deif (cc && cc.indexOf('no-cache') !== -1) return false;
à
if (cc && (cc.indexOf('no-cache') !== -1 || cc.indexOf('max-age=0') !== -1)) return false;
J'ai forké node-fresh et express pour inclure ce correctif dans mon projet
package.json
vianpm
, vous pouvez faire de même. Voici mes fourches, par exemple:https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix
La branche safari-reload-fix est basée sur la balise 3.4.7.
la source
J'ai eu le même problème dans Safari et Chrome (les seuls que j'ai testés) mais je viens de faire quelque chose qui semble fonctionner, du moins je n'ai pas été en mesure de reproduire le problème depuis que j'ai ajouté la solution. Ce que j'ai fait, c'est ajouter une balise meta à l'en-tête avec un horodatage généré. Ça ne semble pas juste mais c'est simple :)
<meta name="304workaround" content="2013-10-24 21:17:23">
Mise à jour PS Autant que je sache, le problème disparaît lorsque je supprime mon proxy de nœud (par proxy, j'entends à la fois le module express.vhost et http-proxy), ce qui est bizarre ...
la source
Essayez d'utiliser la navigation privée dans Safari ou de supprimer l'intégralité de votre cache / cookies.
J'ai eu des problèmes similaires lors de l'utilisation de chrome lorsque le navigateur pensait qu'il avait le site Web dans son cache, mais qu'il ne l'avait pas fait.
La partie de la requête http qui oblige le serveur à répondre à 304 est l'etag. On dirait que Safari envoie le bon etag sans avoir le cache correspondant.
la source
Vieille question, je sais. La désactivation de la fonction de cache n'est pas nécessaire et n'est pas la meilleure façon de gérer le problème. En désactivant la fonction de cache, le serveur doit travailler plus dur et générer plus de trafic. De plus, le navigateur et l'appareil doivent travailler plus dur, en particulier sur les appareils mobiles, cela pourrait être un problème.
La page vide peut être facilement résolue en utilisant la touche Maj + le bouton de rechargement dans le navigateur.
La page vide peut être le résultat de:
Essayez d'abord la touche du clavier Shift + le bouton de rechargement et voyez si le problème persiste et vérifiez votre code.
la source