0

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

对 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?初始请求的两个标头似乎是相同的。

浏览器:铬。

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

更新:

显然 Chrome 对 index.html 的工作还不错,但例如 firefox 就没有……

4

1 回答 1

1

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

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

您将在RFC 2616 第 14.9.4 节 Cache Revalidation and Reload Controls中找到更详细的解释。

于 2011-08-03T21:07:52.863 回答