2016-11-21 2 views
0

ich statische Ressourcen bin das Caching in den folgenden Code mit meinem nginx.conf:nginx ETag Ungültigkeits

http { 
    ... 
    gzip on; 
    gzip_types *; 
    gzip_vary on; 
    ... 
    server { 
     ... 
     location /static { 
      alias /opt/static_root; 
      expires max; 
     } 
    } 
} 

Dies ist ausreichend, um die folgenden HTTP-Header zu setzen:

$ curl -I example.com/static/css/bootstrap.min.css 
Content-Length: 97874 
Last-Modified: Mon, 21 Nov 2016 18:30:33 GMT 
ETag: "58333d49-17e52" 
Expires: Thu, 31 Dec 2037 23:55:55 GMT 
Cache-Control: max-age=315360000 

Doch obwohl die Last-Modified Datum ist später als die zwischengespeicherte Version des Browsers, ich sehe immer noch die alte Version der Datei (getestet auf Firefox 50.0 und Chrome 54.0.2840.98).

Wie kann ich das ETag ungültig machen, so dass der Browser, wenn ich Diffs in meine statischen Dateien implementiere, versteht, sie neu zu laden?

Ich habe versucht nginx -s reload, vergeblich.

Antwort

1

ETags werden verwendet, wenn ein Client eine bedingte Anforderung zum erneuten Überprüfen einer abgelaufenen Ressource vornimmt. Aber in Ihrem Fall läuft die Ressource erst 2037 ab! Der Browser wird die Ressource bis zu diesem Zeitpunkt weiterhin aus dem Cache bereitstellen, ohne dass der Server überprüft wird. Das ist, was Sie mit Ihrem Expires Header gesagt haben.

Normalerweise, wenn Sie far-future ablaufen werden, müssen Sie die Ressource versionieren, indem Sie den Namen ändern. Oder Sie können die Expires in etwas kürzer ändern, in diesem Fall wird die ETags verwendet, wenn der Client versucht, erneut zu validieren.

+0

Ok, also gibt es derzeit keinen Mechanismus, der den sha1-Hash bei jeder Anfrage sendet, um zu entscheiden, ob er ein Asset erneut herunterladen soll, und nur herunterladen, wenn sich der Hashwert geändert hat? – user14717

+0

@NickThompson: Sicher, Sie können das tun, indem Sie die Ressource sofort ablaufen lassen. In diesem Fall sendet der Browser die entsprechenden Header für eine bedingte Anfrage, und der Server wird den ETag verwenden, um festzustellen, ob sich die Ressource geändert hat oder nicht. (FYI, es sieht so aus (http://serverfault.com/a/690374) nginx verwendet keine Hashes, um ETags zu bestimmen.) –