HTTP Expires标头未被浏览器尊重?

时间:2009-06-25 04:24:55

标签: http caching

我的情况是我的(嵌入式)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脚本),我想缓存它,但浏览器在每次刷新时都要求提供徽标。

4 个答案:

答案 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。

请参阅此回答https://stackoverflow.com/a/17716911