
見つからないようです十分ドキュメント。動的な応答を生成するアプリがありますが、それでもヘッダーの恩恵を受けることができるのでLast-Modified
、送信します。
ただし、オンif_modified_since
( に設定before
、http://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since) は、非静的リソースには効果がないようです。例: PHP、Python アプリ。
これは、Nginx が応答Last-Modified
ヘッダーだけを見ているのではないからでしょうか? 以下のように、正しく設定されているように見えるからです。
> GET /3.0/view.json?id=2 HTTP/1.1
> Host: xxxxxxxxxxxxx
> Accept: */*
> If-Modified-Since: Sat, 02 May 2015 19:43:02 GMT
>
< HTTP/1.1 200 OK
* Server nginx/1.4.7 is not blacklisted
< Server: nginx/1.4.7
< Date: Fri, 01 May 2015 19:56:05 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Fri, 01 May 2015 19:56:05 GMT
それとも、私が見落としているもっと大きなものがあるのでしょうか?
if_modified_since
私が期待しているところと比べて、どのように実装されているのか知りたいだけです。応答ヘッダーを調べて、必要に応じてステータスを上書きするだけだと思っていました。間違っていますか?
答え1
アプリの応答でヘッダーを送信するLast-Modified
のは第一歩ですが、If-Modified-Since
アプリは応答するべきであり304 Not Modified
、そうではないため、着信リクエストを適切に処理していないようです200 OK
。 nginx のディレクティブを変更すると、リバース プロキシ キャッシュとして構成しない限り、nginx によって直接処理されるリクエスト (静的リソース) にのみ影響します。 この場合、コンテンツは一定期間キャッシュされ、アプリにヒットしないため、このヘッダー値に関する古い応答が返される可能性があります。 有効にすると、期限が切れると、ヘッダー<X>_cache_revalidate
を使用してIf-Modified-Since
nginx のキャッシュとアプリ間のキャッシュ コンテンツが再検証されます ( <X>
= proxy / fastcgi / scgi / uwsgi)
答え2
Nginx のキャッシュ設定については何も言及されていないため、キャッシュを設定していないものと想定します。これにより、ヘッダーがIf-Modified-Since
動的応答に影響を与えない理由が説明されます。
静的リソースに関しては、Nginx ではどのように処理するかを決定するのが非常に簡単ですIf-Modified-Since
。フィールド内の時刻とファイルが最後に変更された時刻を比較します。問題はありません。
Nginxで動的に生成されたレスポンスに対して同じことを実行したい場合、比較するものがないので、キャッシュをオンにしない限り。デフォルトでは、Nginx は提供した応答を記憶しません。キャッシュをオンにすると、Nginx は受信したリクエストと以前に提供した応答を比較する方法を持つようになり、 を使用できるようになりますIf-Modified-Since
。
私は見つけたこの記事Nginx キャッシュの設定の詳細を学ぶのに非常に役立ちます。