web-dev-qa-db-ja.com

try_filesディレクティブで単一ファイルのキャッシュを無効にします

私はAngular 2つのアプリケーションをこの方法でロケーションセクションを使用してnginxで提供しています:

location / {
  try_files $uri $uri/ /index.html =404;
}

try_filesディレクティブは、ルートディレクトリで要求されたuriを見つけようとします。見つからない場合は、index.htmlを返します。

Index.htmlファイルのキャッシュを無効にする方法は?

17
Rem

Nginxという名前の場所を使用したソリューションを見つけました:

location / {
    gzip_static on;
    try_files $uri @index;
}

location @index {
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
}
27
Rem
location / {
  try_files $uri $uri/ /index.html;
}

location = /index.html {
  expires -1;
}
4
Dmitry MiksIr

すばらしい回答をありがとうレム!彼が受け入れたソリューションを指摘しているように、ルートにアクセスするときにキャッシングヘッダーは追加されません。 www.example.com/。ただし、ディープリンクにアクセスすると追加されます。 www.example.com/some/path。

多くの掘り下げの後、これはngnixモジュールのデフォルトの動作 ngx_http_index_module のせいだと信じていますindex.htmlは、キャッシュコントロールヘッダーなしで提供されます。私が使用した回避策は、最初のロケーションブロックにindex.htmlを指定せずに、2番目のロケーションブロックからルート/を強制的に提供するインデックスディレクティブを含めることでした。

また、別の問題がありました。最初のロケーションブロックに、ディープリンクを壊すルートディレクティブを含めましたが、これも 悪いアイデア です。ルートディレクティブをサーバーレベルに移動しました。

これが役立つことを願っています、これが私の解決策です...

server {
  listen       80;
  server_name  localhost;
  root   /usr/share/nginx/html;

  location / {
    add_header X-debug-whats-going-on 1;
    index do-not-use-me.html;
    try_files $uri @index;                 
  }

  location @index {
    add_header X-debug-whats-going-on 2;
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
  }
}

どのロケーションブロックがどのコンテンツを提供しているかを明確にするために、デバッグヘッダーを含めました。また、 add_headerディレクティブの直感的でない動作 に注意する価値があります。これは、ロケーションブロック外のすべてのリクエストにヘッダーを追加する場合にも不可欠です。

4
Simon Ness

私のAngularアプリにはindex.htmlとnginxの設定への変更が含まれています。

index.html

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

nginx.conf

location / {
  try_files $uri $uri/ /index.html;
}

location ~ \.html$ {
  add_header Cache-Control "private, no-cache, no-store, must-revalidate";
  add_header Expires "Sat, 01 Jan 2000 00:00:00 GMT";
  add_header Pragma no-cache;
}

ユーザーが「site.com」と「site.com/some/url」または「site.com/#/login」に移動したときに機能します。 「index.html」の変更は、主に安全な側にあります。

2
Denys Vuika

コンテンツタイプマッピングを使用できます(1つの.htmlファイル):

map $sent_http_content_type $expires {
    default                    off;
    text/html                  Epoch; # means no-cache
}

server {
  expires $expires;
}


0
Daniel