Http缓存 - 检查文件更改是否适用于html但不适用于xml - Chrome

时间:2011-08-03 11:57:27

标签: caching http-headers http-caching

我有两个文件,我想缓存客户端,直到原始更改。

对html页面的调用(index.html)在响应中有以下标题:

HTTP/1.1 200 OK
Cache-Control: public,max-age=7776000
Content-Type: text/plain
Content-Encoding: gzip
Last-Modified: Wed, 13 Jul 2011 13:02:04 GMT
Accept-Ranges: bytes
ETag: "e07f1e105d41cc1:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 03 Aug 2011 11:47:47 GMT
Content-Length: 242

对xml页面的调用(application-context-dashboard.xml)在响应中有以下标题:

HTTP/1.1 200 OK
Cache-Control: public,max-age=7776000
Content-Type: text/xml
Content-Encoding: gzip
Last-Modified: Wed, 03 Aug 2011 11:31:56 GMT
Accept-Ranges: bytes
ETag: "10ba5f3d051cc1:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 03 Aug 2011 11:47:14 GMT
Content-Length: 457

现在,当我重新加载它们时,对于index.html,会发送304以检查文件是否已更改。对于xml文件,不会发送304并触发客户端缓存。

304调用index.html: 请求:

GET /edumatic3/trunk/backend/index.html HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nl,en-US;q=0.8,en;q=0.6,fr;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: CurrenUICulture=en-us
If-None-Match: "e8626a973e45cc1:0"
If-Modified-Since: Mon, 18 Jul 2011 11:34:01 GMT

有没有办法为xml文件实现相同的结果? +为什么它适用于html而不适用于xml?初始请求的两个标题似乎相同。

浏览器:Chrome。

其他静态内容(如swf,txt,...

)也存在同样的问题

更新:

显然,Chrome为index.html做了一个不错的工作,但是火狐例如没有......

1 个答案:

答案 0 :(得分:1)

当您重新加载页面时,浏览器必须检查它是否仍然是最新的。所以它会再次请求页面。 If-None-Match和If-Modified-Since请求标头允许服务器返回304 Not Modified响应。

对于页面上的其他元素,它会按预期执行缓存。您的第一个响应包含Cache-Control:public,max-age = 7776000标头。这样您就告诉浏览器在接下来的三个月内不要检查此文件。 如果您希望浏览器反复请求每个文件,请删除max-age部分并添加must-revalidate。 ETag仍然允许您发送304s。

您可以在RFC 2616, Section 14.9.4 Cache Revalidation and Reload Controls中找到更详细的说明。