我的情况是我的(嵌入式)Web服务器正在发送Expires标头,但浏览器似乎不尊重标头设置,即,如果我刷新页面,浏览器会请求应该缓存的资源。以下是要交换的标题:
https://192.168.1.180/scgi-bin/ajax/ajax.cgi GET /scgi-bin/ajax/ajax.cgi HTTP/1.1 Host: 192.168.1.180 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cache-Control: max-age=0 HTTP/1.x 200 OK Date: Wed, 24 Jun 2009 20:26:47 GMT Server: Embedded HTTP Server. Connection: close Content-Type: text/html ---------------------------------------------------------- https://192.168.1.180/scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 GET /scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 HTTP/1.1 Host: 192.168.1.180 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) Accept: image/png,image/*;q=0.8,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: https://192.168.1.180/scgi-bin/ajax/ajax.cgi Cache-Control: max-age=0 HTTP/1.x 200 OK Date: Wed, 24 Jun 2009 20:26:47 GMT Server: Embedded HTTP Server. Connection: close Expires: Wed, 1 Jun 2011 20:00:00 GMT Content-Type: image/jpg ----------------------------------------------------------
ajax.cgi返回一个带有徽标图形的html页面(通过static.cgi脚本),我想缓存它,但浏览器在每次刷新时都要求提供徽标。
答案 0 :(得分:16)
如果刷新页面,浏览器将忽略Expires标头。它始终通过联系Web服务器来检查缓存条目是否仍然有效。理想情况下,它将使用If-Modified-Since请求标头,以便在缓存条目仍然有效时服务器可以返回“304 Not modified”。
您没有设置Last-Modified标头,因此浏览器必须对内容执行无条件GET以确保其是最新的。
本博文中描述了设置Expires和Last-Modified的一些经验法则:
http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/
答案 1 :(得分:13)
你在浏览器中做什么?我看起来像你点击重新加载按钮甚至像shift + Reload。通常,浏览器不会发送Cache-Control: max-age=0
标头。这意味着浏览器已经丢弃了缓存的图像,并希望再次获取它。
如果您只是导航到另一个页面然后再返回,则浏览器应该尊重您的Expires标题。
此外,您可以在回复中添加Cache-control: public
标头。这允许代理和浏览器明确地缓存图像。
答案 2 :(得分:0)
CGI脚本看起来像是有时间戳参数......这不会改变,是吗?浏览器应该将每个唯一的URL视为缓存中的不同对象,因此如果每个请求都在更新,则它将与缓存的图像不匹配。
此外,Expires字段不完全是RFC 1123格式,因为日期需要两位数。这可能是也可能不是问题,但需要检查。浏览器包含Cache-Control: max-age=0
,表示它认为其缓存可能已过期。
服务器收到此验证请求后,可以返回当前正在执行的304 (Not Modified)
或200 (OK)
。
答案 3 :(得分:0)
您的https证书中的任何错误都会导致浏览器不尊重您的标题。
尝试不使用https,看看它是否适用于普通的http。