在 Response-Header 中加上這幾項:
Last-Modified: Wed, 18 Jun 2008 14:22:27 GMT
Cache-Control: max-age=600
Expires: Wed, 18 Jun 2008 14:48:39 GMT
Date: Wed, 18 Jun 2008 14:38:39 GMT
其中 Last-Modified 后面的日期是上次更新 config 的時間,Date 后面是當前時間,Expires 后面是當前時間 + 10分鐘,10分鐘就是 Cache-Control 后面的 max-age,單位是秒。因為看到 GAE 對 static 文件的 Cache 時間也是10分鐘,所以我使用了這個數字。
Last-Modified
如果客戶端收到的 Response 中包含 Last-Modified,那么下次 request 的時候就會在 Request Header 中包含 If-Modified-Since 字段,值就是上次服務器發送的 Last-Modified,服務器端會判斷上次的 config 時間是否比 If-Modified-Since 晚。如果自上次 request 之后又更新了 config,那么服務器就會返回完整的內容;如果期間沒有更新 config,那么服務器就沒必要返回完整的內容,只需要向客戶端發送一個 304 Not Modified 狀態碼就可以了。
Cache-Control、Date 和 Expires
這幾個參數的組合,表示告訴瀏覽器:這個文件在多長時間之內不會更改,在這個時間內不需要再 request,保守起見,我設置了10分鐘。
瀏覽器行為
如果只是在網站的鏈接之間 click click click,那么瀏覽器會完全遵守上述行為。這樣可以盡可能地減少請求次數,以及 response 的數據量。
如果在某個頁面點擊了瀏覽器的刷新按鈕或者按 F5,瀏覽器會忽略 Expires 時間,把該頁面需要的所有的文件都重新請求一遍。
如果按住 Ctrl 再刷新或者 Ctrl-F5 (俗稱強制刷新),瀏覽器將不會發送 Last-Modified Header,將所有需要的文件請求一遍,服務器會返回文件的完整內容,而不是僅僅一個 304 Not Modified 狀態碼。
后記
經初步觀察,現在瀏覽器不會每次都彪呼呼地去請求一大堆 css、jpg、gif 文件了,瀏覽器也不會每次都腦殘地返回完整內容了,看來是有效了。