Wenn ich eine mit Express erstellte Website neu lade, wird mit Safari (nicht mit Chrome) eine leere Seite angezeigt, da mir der NodeJS-Server einen 304-Statuscode sendet.
Wie kann man das lösen?
Natürlich könnte dies auch nur ein Problem von Safari sein, aber tatsächlich funktioniert es auf allen anderen Websites einwandfrei, so dass es auch auf meinem NodeJS-Server ein Problem sein muss.
Um die Seiten zu generieren, verwende ich Jade mit res.render
.
Update: Es scheint, dass dieses Problem auftritt, weil Safari 'cache-control': 'max-age=0'
beim Neuladen sendet .
Update 2: Ich habe jetzt eine Problemumgehung, aber gibt es eine bessere Lösung? Problemumgehung:
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…
}
Update 3: Der vollständige Codeteil lautet derzeit:
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);
}
}
Antworten:
Einfachste Lösung:
Alternative Lösung hier, wenn Sie mehr Kontrolle wünschen:
http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/
quelle
Wie Sie sagten, sendet Safari
Cache-Control: max-age=0
beim Nachladen. Express (oder genauer gesagt die Abhängigkeit von Express, knotenfrisch) berücksichtigt den Cache als veraltet, wennCache-Control: no-cache
Header empfangen werden, tut dies jedoch nicht fürCache-Control: max-age=0
. Soweit ich das beurteilen kann, sollte es wahrscheinlich so sein. Aber ich bin kein Experte für Caching.Das Update besteht darin, die Zeile 37 von
node-fresh/index.js
von (was aktuell ist) zu ändernzu
Ich habe Node-Fresh und Express gegabelt, um diesen Fix in die
package.json
Via meines Projekts aufzunehmennpm
. Sie könnten das Gleiche tun. Hier sind meine Gabeln zum Beispiel:https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix
Der Zweig safari-reload-fix basiert auf dem Tag 3.4.7.
quelle
Ich hatte das gleiche Problem in Safari und Chrome (die einzigen, die ich getestet habe), aber ich habe nur etwas getan, das zu funktionieren scheint. Zumindest konnte ich das Problem nicht reproduzieren, seit ich die Lösung hinzugefügt habe. Ich habe dem Header ein Metatag mit einem generierten Zeitstempel hinzugefügt. Scheint nicht richtig, aber es ist einfach :)
Update PS Soweit ich das beurteilen kann, verschwindet das Problem , wenn ich meinen Knoten Proxy entfernen (durch Proxy - i sowohl express.vhost bedeuten und http-Proxy - Modul), das ist seltsam ...
quelle
Versuchen Sie, in Safari privat zu surfen oder Ihren gesamten Cache / Ihre gesamten Cookies zu löschen.
Ich hatte einige ähnliche Probleme mit Chrome, als der Browser dachte, die Website sei im Cache, aber tatsächlich nicht.
Der Teil der http-Anfrage, der den Server dazu bringt, auf 304 zu antworten, ist das etag. Anscheinend sendet Safari das richtige Etag, ohne den entsprechenden Cache zu haben.
quelle
Alte Frage, ich weiß. Das Deaktivieren der Cache-Funktion ist nicht erforderlich und nicht der beste Weg, um das Problem zu verwalten. Durch Deaktivieren der Cache-Funktion muss der Server härter arbeiten und generiert mehr Datenverkehr. Auch der Browser und das Gerät müssen härter arbeiten, insbesondere auf Mobilgeräten kann dies ein Problem sein.
Die leere Seite kann einfach mit der Umschalttaste + der Schaltfläche zum erneuten Laden im Browser gelöst werden.
Die leere Seite kann ein Ergebnis sein von:
Versuchen Sie zuerst die Umschalttaste + Taste zum erneuten Laden, um festzustellen, ob das Problem weiterhin besteht, und überprüfen Sie Ihren Code.
quelle