web-dev-qa-db-ja.com

max-age = 0リクエスト用にnginxを構成する

proxy_cacheのリバースプロキシとしてnginxを使用しています。バックエンドはcache-control応答ヘッダーを設定しており、可能な場合はnginxがキャッシュから応答を提供します。

ただし、リクエストヘッダーCache-Control:max-age=0を設定して、クライアントがキャッシュをバイパスできるようにしたいと思います。このようにして、ユーザーはブラウザでCTRL+Rを押すことで新しいコピーを取得できます。デフォルトでは、nginxはCache-Controlリクエストヘッダーを無視しているようです。

クライアントがCache-Control:max-age=0でリソースを要求するたびに、バックエンドから新しいコピーをフェッチしてキャッシュを更新するようにnginxを構成するにはどうすればよいですか?

2
Jeroen

proxy_cache_bypassを使用できます。

proxy_cache_bypass  $http_cache_control;

これにより、nginxは、クライアントからのHTTPリクエストにCache-Controlヘッダーが存在する場合に、ドキュメントの新しいコピーをフェッチします。

バックエンドからの結果の応答は、引き続きキャッシュの対象となることに注意してください。キャッシュされないようにする場合は、 proxy_no_cache ディレクティブでも同じ引数を使用します。

ソース: http://wiki.nginx.org/HttpProxyModule#proxy_cache_bypass


クライアントのヘッダーにCache-Control: max-age=0が含まれている場合にのみキャッシュをバイパスしたい場合(たとえば、別のバリアントCache-Control: no-cacheを明示的にサポートしない場合、これは実際にはページの新しいコピーをより強く優先すると思われます) max-age=0 is)よりも、次のものを使用できますが、このような制限があるためお勧めしません。

set $cc_ma  0;
if ($http_cache_control = "max-age=0") {    # honour ⌘R, ignore ⇧⌘R (yes, bad idea!)
    set $cc_ma  1;
}
proxy_cache_bypass  $cc_ma;

ところで、Pragma: no-cacheもありますが、これは明らかに説明されていませんが、私の限られた一連の実験では、常にCache-Control: no-cacheが付随しているため、元のワンライナーがおそらく最善を尽くしますジョブ。

注意として、リロードまたはをクリックすると、SeaMonkeyはCache-Control: max-age=0を送信します ⌘R、およびPragma: no-cache\r\nCache-Control: no-cache Shiftリロードまたは ⇧⌘R

2
cnst