错误的日期格式可能导致走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是这种情况。
如果那种预售秒杀商品,是会频繁刷新的。
正文到此结束
- 本文标签: 其他
- 本文链接: http://www.it586.cn/article/542
- 版权声明: 本文由miger原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权