Post/Redirect上的整页重新加载/忽略缓存控制

Kri*_*nck 11 safari caching webkit google-chrome post-redirect-get

我有一个页面加载了很多图像,CSS和JavaScript.我已经添加了一个远期的Expires头,并在这些外部依赖项上将Cache-Control设置为public,因此它们应该被缓存.但是每次我执行Post/Redirect/Get chrome都会尝试再次加载它们.此行为与重新加载页面非常相似.我已经添加了ETag并处理了If-None-Match标头,它有点帮助,但它仍然会产生太多无用的请求.

如何告诉chrome和safari从缓存中获取文件?

chrome   NOK
safari   NOK
firefox  OK
ie       OK
Run Code Online (Sandbox Code Playgroud)

另请参阅Google支持论坛上发布/重定向/获取忽略缓存控制的完整页面重新加载.

澄清:

我不希望浏览器请求image1.png两次.它应该被缓存.

200 GET  page1.html
200 GET  image1.png (Cache-Control: public, Expires and ETag)
302 POST action.asp (form submitted from page1.html, redirects)
200 GET  page2.html
304 GET  image1.png (If-None-Match)
Run Code Online (Sandbox Code Playgroud)

例:

我已经创建了一个简单的例子来说明问题.

http://crydust.be/lab/prg/

头:

我随图像发送的标题是:

HTTP/1.1 200 OK
Date: Fri, 18 Jun 2010 11:30:22 GMT
Server: Apache
Cache-Control: public, max-age=86400
Expires: Sat, 19 Jun 2010 11:30:24 GMT
Etag: "123"
Content-Length: 866
Content-Type: image/png
Run Code Online (Sandbox Code Playgroud)

哪个应该让它缓存24小时.没有变化:*或类似的东西.

更新: 此行为现​​在也出现在iOS 4上的Safari Mobile中.页面加载速度的可怕回归.

更新: webkit bugzilla中有关于此问题的错误报告. 错误38690 - 提交导致服务器重定向的POST会导致重新下载所有缓存的项目

更新: 问题在iOS 4.0.1上仍然存在

更新: 问题在iOS 4.1上仍然存在

更新: 问题在iOS 4.2上仍然存在

更新: 问题在iOS 4.2.1和Chrome版本6至9中仍然存在.

更新: Chromium项目中有关于此问题的错误报告.(你可以将它标记为显示你关心) 问题68621:发布/重定向/获取忽略缓存指令

更新: Chrome从版本6到10仍然存在问题.现在是一个9个月大的bug.

更新: 问题已于2011-03-21 19:33:07太平洋标准时修复.这反映在铬12(金丝雀)的行为上.

Kei*_*ith 1

当您在 Chrome、Safari 或 IE8 中按 F5/刷新时,所有 GET 资源都会再次请求,即使它们已被缓存。

如果您使用开发工具或 Fiddler 观察请求/响应,您将看到服务器以 HTTP 304 状态进行响应,但没有任何内容。这告诉浏览器他们不需要再次下载并且可以继续使用缓存。

在Chrome的开发工具的资源选项卡中,这样刷新的文件会有延迟时间,但下载时间为0毫秒。

如果您通过离开并返回来重新加载页面,您会发现这些缓存的文件不会再次检索,并且不会检查服务器。

F5/刷新 GET 静态资源的这种行为是正确的 - FX 和 IE6 做错了。它还有助于解决大多数用户不知道的令人困惑的 CTRL+F5 命令。

您无法缓存 POST 或返回临时 HTTP 重定向的页面:

POST 更改数据,并且在再次发送之前应始终进行提示,并且其结果永远不会被缓存。

重定向在 HTTP 内容中的较低级别进行处理 - 低于缓存。实际上,它告诉浏览器从其他地方获取资源,虽然它可以缓存,但它尚未缓存重定向,需要再次检查。

您应该能够缓存 301 永久重定向,但根据 HTTP 规范,不应缓存 302 或 303 临时重定向。