为什么这个 HTTP 响应没有被缓存?

为什么这个 HTTP 响应没有被缓存?

以下是我的网络应用程序中页面的请求和响应标头:

请求标头:

GET http://my-server/myapp/mypage.aspx?myid=123 HTTP/1.1
Accept: */*
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: my-server
Connection: Keep-Alive
Pragma: no-cache
Cookie: <sanitized>

响应标头:

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 173788
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Thu, 15 Jul 2010 17:48:25 GMT

IE8 和 Firefox 似乎忽略了此页面的缓存副本。每次我加载页面时,这两种浏览器都会发送相同的无条件请求。我已验证 IE8 至少会将响应缓存在“临时 Internet 文件”目录中。

据我所知,Cache-Control: private应该指示两个浏览器缓存响应。由于没有到期信息,它们应该发送条件请求来验证缓存的副本以供以后的请求使用,但这并没有发生。是否有一些浏览器级的启发式方法拒绝缓存的副本(或完全阻止缓存)?还是我对标头的理解完全错误?

所涉及的 Web 服务器是运行在 Windows 7 Enterprise 上的 IIS 7.5。浏览器是 IE 8 和 Firefox 3.6.6,以管理员身份在与 IIS 相同的计算机上运行(请求发送到计算机的主机名,而不是 localhost)。

有趣的是,IE9 平台预览版 3 甚至没有发送条件请求 - 它盲目地重复使用缓存的副本!

答案1

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1说“私有(非共享)缓存可能缓存响应。”

我猜一切都是可能的,你只能确保页面不会被缓存在公共缓存中,而不能确保页面会被缓存

答案2

尝试使用Expires标题进行响应。

相关内容