NGINXを介したHTTPレスポンスを無期限にキャッシュできません
-
20-12-2019 - |
質問
私はNginxに私の資産(JS、CSS)を永遠にキャッシュすること、または少なくとも非常に長い間キャッシュに伝えようとしています。
アセットバンドルが/assets/
URIプレフィックス(E./assets/foo-{fingerprint}.js
)でコンパイルされ公開されると、それはそこに留まり、変更する必要がありません。
インターネットは私に次の規則を書くべきです:
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;
}
.
私はこれがHTTPコード304「修正されていない」との反応をもたらすと予想されるでしょうが、私が得るものは毎回一貫したHTTP 200(OK)です。
私は他のいくつかのアプローチを試してきました、例えば:
a)過去の時点で修正時間を明示的に設定する;
add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";
.
b)If-None-Match
チェックへの切り替え
add_header ETag $1;
if_modified_since off;
.
しかし、必要に応じて本当に働いていた唯一のものはこれでした:
add_header Last-Modified "Thu, 01 Jan 2030 00:00:00 GMT";
if_modified_since before;
.
私は迷子になっています。これは私が思ったすべてのものに反しています。助けてください。
解決
彼らはあなたに間違ったアドバイスを与えるのであなたはあなたのインターネットを変えるべきです。
あなたの場所からすべてのadd_header
行を削除するだけで(そして余剰brake
):
location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
gzip_static on; # there's also a .gz of the asset
expires max;
}
.
で、本当のインターネットからドキュメントを読みます。 http://nginx.org/r/expires と http://tools.ietf.org/html/rfc2616
他のヒント
私の構成の一部であるようです。私の研究中は、ブラウザが発見的分析を使用して条件付きヘッダー(E-Tag、Last-Modified)で要求を検証することを認識しました。バックエンドの回答のために多くの意味がありますので、サーバーリソースを保存するためにそれを処理できます。
しかし静的ファイル(JS、CSS、画像)の観点からは、条件付きの検証なしにブラウザにすぐにサービスを提供するように言うことができます。変更が発生した場合はファイル名を更新した場合は役に立ちます。
構成のこの部分はそれが起こる可能性があります:
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
.