錯誤的日期格式可能導致走nginx proxy cache時不能進行304響應

昨天在整合某些系統的nginx配置時,出現了當使用nginx cache時無法返回304響應的情況,出問題的響應頭:
Content-Type:text/html; charset=gb2312
Date:Mon, 05 Jan 2015 01:58:05 GMT
Expires:Mon, 05 Jan 15 02:03:00 GMT
Last-Modified:Mon, 05 Jan 15 01:58:00 GMT
 
對於這個日期格式 nginx是不認識的,nginx能識別的日期格式:
no = 0,
rfc822, /* Tue, 10 Nov 2002 23:50:13 */
rfc850, /* Tuesday, 10-Dec-02 23:50:13 */
isoc /* Tue Dec 10 23:50:13 2002 */
 
這是因爲Expires和Last-Modified是通過如下方式設置的:

 

header('Last-Modified: ' . gmdate('D, d M y H:i:s', $now_time) . ' GMT');
header('Expires: ' . gmdate('D, d M y H:i:s', $now_time + $max_age) . ' GMT');
 
這樣生成的年是兩位而不是四位,把小寫y改成大寫Y即可。
 
不過對於如上內容,瀏覽器和CDN端能正常識別該日期,並能正確的返回304。
 
 
另外在測試時發現,在使用Chrome瀏覽器時:
【1】假設第一次請求時響應內容是:
Status Code:200 OK
Age:20
Cache-Control:max-age=300
Connection:keep-alive
Content-Encoding:gzip
Content-Length:14412
Content-Type:text/html; charset=gbk
Date:Mon, 05 Jan 2015 02:10:56 GMT
Expires:Mon, 05 Jan 2015 02:15:55 GMT
Last-Modified:Mon, 05 Jan 2015 02:10:55 GMT
Vary:Accept-Encoding
 
【2】當按F5時,會發現返回了304:
Status Code:304 Not Modified
Cache-Control:max-age=300
Connection:keep-alive
Date:Mon, 05 Jan 2015 02:12:11 GMT
Expires:Mon, 05 Jan 2015 02:15:55 GMT
Vary:Accept-Encoding
【3】如果再次按F5時,會發現
Status Code:200 OK
Age:4
Cache-Control:max-age=300
Connection:keep-alive
Content-Encoding:gzip
Content-Length:14412
Content-Type:text/html; charset=gbk
Date:Mon, 05 Jan 2015 02:10:56 GMT
Expires:Mon, 05 Jan 2015 02:15:55 GMT
Last-Modified:Mon, 05 Jan 2015 02:10:55 GMT
Vary:Accept-Encoding
如果【2】時再帶上Last-Modified,那麼【3】還是304, 目前測試幾個瀏覽器中只有Chrome是這種情況。
 
如果那種預售秒殺商品,是會頻繁刷新的。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章