web-dev-qa-db-ja.com

Nginx `if_modified_since`は静的リソースでのみ機能しますか?

十分なドキュメントが見つからないようです。動的応答を生成するアプリがありますが、Last-Modifiedヘッダー-送信します。

ただし、if_modified_sincebeforeに設定 http://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since ごとに)は、 -静的リソース。例:php、python apps。

これは、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は、私が自分の期待を設定しているところと比較して実装されています。私はそれが応答ヘッダーを見るだけであり、必要に応じてステータスをオーバーライドすると想定しました。私が間違っている?

7

アプリの返信でLast-Modifiedヘッダーを送信することから始めますが、アプリはIf-Modified-Sinceではなく304 Not Modifiedで返信する必要があるため、受信リクエストで200 OKを適切に処理できないようです。 nginxでディレクティブを変更しても、リバースプロキシキャッシュとして構成しない限り、nginxによって直接提供されるリクエスト、つまり静的リソースのみに影響します。この場合、コンテンツがアプリにヒットすることなく一定期間キャッシュされるため、このヘッダー値に関して古い応答を提供する可能性があります。 <X>_cache_revalidateをオンにすると、If-Modified-Sinceヘッダーを使用して、期限が切れたらnginxのキャッシュとアプリの間のキャッシュコンテンツを再検証します(ここで<X> = proxy/fastcgi/scgi/uwsgi)

5
Xavier Lucas

Nginxのキャッシュ構成について何も言及していないので、キャッシュを設定していないと想定します。これは、If-Modified-Sinceヘッダーが動的応答に影響しない理由を説明します。

静的リソースに関しては、NginxはIf-Modified-Sinceの処理方法を決定する非常に簡単な方法を備えています。フィールドの時間とファイルが最後に変更された時間を比較します。そこに問題はありません。

動的に生成された応答でNginxに同じことを実行させたい場合、キャッシュをオンにしない限り、比較するものは何もありません。デフォルトでは、Nginxはそれが提供した応答を覚えていない。キャッシングをオンにすると、Nginxは受信リクエストを以前に与えられたレスポンスと比較する方法を持っているため、If-Modified-Sinceを使用する方法があります。

私は この記事 を見つけました。これは、Nginxキャッシュの設定の詳細を学ぶのに非常に役立ちます。

0
Louis