Das unbegrenzte Zwischenspeichern einer HTTP-Antwort über Nginx schlägt fehl
-
20-12-2019 - |
Frage
Ich versuche Nginx anzuweisen, einige meiner Assets (JS, CSS) für immer oder zumindest für eine sehr lange Zeit zwischenzuspeichern.
Die Idee ist, dass, sobald ein Asset-Bundle zusammengestellt und veröffentlicht wurde, mit einem /assets/
URI-Präfix (z. B. /assets/foo-{fingerprint}.js
) es bleibt dort und muss sich nie ändern.
Das Internet sagte mir, ich solle die folgende Regel schreiben:
location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
gzip_static on; # there's also a .gz of the asset
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
break;
}
Ich gehe davon aus, dass dies zu Antworten mit dem HTTP-Code 304 „Not Modified“ führen würde, aber ich erhalte jedes Mal ein konsistentes HTTP 200 (OK).
Ich habe einige andere Ansätze ausprobiert, zum Beispiel:
a) die Änderungszeit explizit auf einen konstanten Zeitpunkt in der Vergangenheit zu setzen;
add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";
b) Umschalten auf If-None-Match
Schecks;
add_header ETag $1;
if_modified_since off;
Das Einzige, was wirklich wie nötig funktionierte, war jedoch Folgendes:
add_header Last-Modified "Thu, 01 Jan 2030 00:00:00 GMT";
if_modified_since before;
Ich bin verloren.Das widerspricht allem, was ich für richtig gehalten habe.Bitte helfen Sie.
Lösung
Sie sollten Ihr Internet wechseln, da es Ihnen falsche Ratschläge gibt.
Entfernen Sie einfach alle add_header
Leitungen von Ihrem Standort (sowie überschüssige brake
):
location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
gzip_static on; # there's also a .gz of the asset
expires max;
}
und lesen Sie die Dokumente aus dem wahren Internet: http://nginx.org/r/expires Und http://tools.ietf.org/html/rfc2616
Andere Tipps
Es scheint Teil meiner Konfiguration zu sein.Während meiner Recherche habe ich festgestellt, dass der Browser heuristische Analysen verwendet, um Anfragen mit ConditionalGet-Headern (E-Tag, Last-Modified) zu validieren.Für Back-End-Antworten ist dies sehr sinnvoll, sodass Sie damit umgehen können, um Serverressourcen zu sparen.
Aber in Bezug auf statische Dateien (JS, CSS, Bilder) können Sie den Browser anweisen, sie sofort ohne bedingte Get-Validierung bereitzustellen.Es ist hilfreich, wenn Sie den Dateinamen aktualisieren, wenn Änderungen vorgenommen werden.
Dieser Teil der Konfiguration macht es möglich:
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";