2016-11-21 16 views
0

私は私のnginx.confに次のコードを使用して、静的なリソースをキャッシュしています:nginxののETagを無効

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

これは、次のHTTPヘッダーを設定するのに十分である:でもLast-Modifiedかかわらず、しかし

$ 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 

を日付はブラウザのキャッシュされたバージョンより遅いですが、Firefoxのバージョン50.0とChrome 54.0.2840.98でテストされた古いバージョンのファイルが引き続き表示されています。

どのようにして私は静的ファイルにdiffを配布するときに、ブラウザがそれらをリロードすることを理解できるようにETagを無効にできますか?

私はnginx -s reloadを試しましたが、無駄です。

答えて

1

ETagは、クライアントが期限切れのリソースを再検証する条件付き要求を行うときに使用されます。しかしあなたの場合、リソースは2037年まで有効期限切れになりません!ブラウザは、それまでサーバから確認することなく、キャッシュからリソースを引き続き提供します。それはあなたのExpiresヘッダーでそれを伝えたものです。

通常、将来の期限切れになる場合は、名前を変更してリソースをバージョンアップする必要があります。またはExpiresを短く変更することができます。この場合、クライアントが再検証を試みるときにETagsが使用されます。

+0

アセットを再ダウンロードするかどうかを判断するためのリクエストごとにsha1ハッシュを送信し、ハッシュが変更されたときだけダウンロードするメカニズムは現在ありません。 – user14717

+0

@NickThompson:もちろん、リソースをすぐに期限切れにするように設定することでこれを行うことができます。その場合、ブラウザは条件付き要求に対して適切なヘッダーを送信し、サーバーはETagを使用してリソースが変更されているかどうかを判断します。 (FYI、それはそうですね(http://serverfault.com/a/690374)nginxはハッシュを使ってETagsを決定しません)。 –

関連する問題