错误的日期格式可能导致走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是这种情况。
 
如果那种预售秒杀商品,是会频繁刷新的。
 

你可能感兴趣的:(cache)