
我似乎找不到足夠的文件.我有一個應用程式可以產生一些動態回應,但仍然可以從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
將使用標頭重新驗證 nginx 快取和您的應用程式之間的快取內容(其中= proxy / fastcgi / scgi / uwsgi)If-Modified-Since
<X>
答案2
由於您沒有提及 Nginx 中的快取配置,我將假設您沒有設定緩存,這可以解釋為什麼您的If-Modified-Since
標頭對動態回應沒有影響。
當涉及到靜態資源時,Nginx 有一個非常簡單的方法來決定如何處理If-Modified-Since
:它將欄位中的時間與檔案上次修改的時間進行比較。那裡沒問題。
當您希望 Nginx 對動態產生的回應執行相同操作時,它沒有什麼可以比較的,除非你打開緩存。預設情況下,Nginx 不會記住它所提供的回應。當您開啟快取時,Nginx 有一種方法可以將傳入請求與先前給出的回應進行比較,因此可以使用If-Modified-Since
.
我發現了本文對於了解設定 Nginx 快取的詳細資訊非常有用。