IE缓存问题

And*_*ock 3 internet-explorer http

在IE中(至少8个,可能还有其余的):

我提出要求:

GET http://www.mydomain.com/ HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

服务器响应:

HTTP/1.1 200 OK
Cache-Control: private, must-revalidate
Last-Modified: Fri, 25 Mar 2011 10:52:34 GMT
Date: Fri, 25 Mar 2011 10:54:15 GMT
Run Code Online (Sandbox Code Playgroud)

我再提出一个要求:

GET http://www.mydomain.com/ HTTP/1.1
If-Modified-Since: Fri, 25 Mar 2011 10:52:34 GMT
Run Code Online (Sandbox Code Playgroud)

服务器响应:

HTTP/1.1 304 Not Modified
Cache-Control: private, must-revalidate
Last-Modified: Fri, 25 Mar 2011 10:52:34 GMT
Run Code Online (Sandbox Code Playgroud)

然后我转到一些页面,说:

http://www.mydomain.com/somepage
Run Code Online (Sandbox Code Playgroud)

它上面有一个链接:

<a href="http://www.mydomain.com/">click me</a>
Run Code Online (Sandbox Code Playgroud)

当我点击这个时,IE显示以前缓存的对此锚定URI的响应,甚至没有发出请求.

为什么不服从must-revalidate?这正如我在FireFox和Webkit中所期望的那样

我该如何服从它?

谢谢

Mar*_*tin 5

问题很可能是您没有在响应中设置max-ageExpires.

Cache-Control: must-revalidate 告诉客户端,一旦此资源到期,他们必须针对原点重新验证它:

缓存必须每次都进行端到端的重新验证,如果仅基于源服务器的Expires或max-age值,缓存的响应是陈旧的


由于您没有在页面变得陈旧时声明,IE8依靠启发式方法进行有根据的猜测.如果您希望IE 每次都重新验证页面,您需要添加适当的标头以保持到期时间短:

Cache-Control: private, must-revalidate, max-age=1
Expires: [immediately, or even a date in the past]
Run Code Online (Sandbox Code Playgroud)