错误的日期格式可能导致走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)》许可协议授权