http - 更正 HTTP 响应 header 以在内容过期后导致 304

标签 http caching http-headers

我希望 HTTP 响应在 24 小时后过期(这意味着浏览器要到明天才会对该 URL 发出任何请求)。但是,如果请求在到期后明天重新发出,我想确保浏览器将发送正确的请求 header ,以便服务器发送 304 而不是强制客户端重新下载整个响应正文(如果没有) ' 在服务器上更改。我希望 304 也能在 24 小时后过期。

首先,这个场景可能吗?或者我必须在 Expiration-style 缓存和 304-style 缓存之间做出选择,但不能同时选择两者?如果可能的话,什么是正确的响应 header (包括初始响应和后续 304 响应)来实现它?

如果像经常发生的那样,答案因浏览器类型/版本而异,那么哪些 header 适用于哪些浏览器——哪些浏览器根本无法执行我想要的操作?我只对当今最常用的浏览器感兴趣(例如 IE6+、FF3+、Chrome 最新版、Safari 最新版)?

如果这个答案已经在 SO 上被问到,我深表歉意——我搜索了一段时间却一无所获。

澄清:我问这个问题是因为我正在组装一个自动化测试套件来验证,无论服务器平台如何,网络应用程序正在生成正确的 HTTP header 以生成客户端-我们希望所有网络应用程序都具有的缓存行为。所以我对如何配置 Apache/IIS/PHP/Rails/Django/JSP/ASP.NET/etc 不感兴趣(至少现在)。生成正确的标题。我只是想知道,仅在 HTTP 层,正确的 header 是什么。

更新:我找到了 this SO question这回答了我的部分问题。根据RFC 2616 10.3.5 ,它说,我应该在服务器返回的 304 中包含一个 Expires:Cache-Control: max-age header 。这绝对是理想的行为。

然而,这个问题没有回答的是,这种符合 RFC 的方法是否适用于现有的流行浏览器,尤其是 IE6/7/8,这是通常的标准合规问题,还有 IE9、FF4+、最新的 Chrome ,以及我们的应用程序也必须支持的最新 Safari。如果其中任何浏览器的行为不符合 RFC 要求,是否有我可以使用的解决方法?

最佳答案

发送一个 ETAG header ,以便客户端可以发出条件 HTTP 请求以在其新鲜度生命周期到期后重新验证响应。

发送 Cache-Control: max-ageExpires 指令来指定您希望资源何时过期。

避免使用 Vary header 或任何禁止缓存的指令。

这些指令适用于所有流行的浏览器(IE6+、Firefox、Chrome),但 Windows 上的 Safari 除外,它缺乏跨多个 session 的持久 HTTP 缓存。

http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx解释当您未能提供适当的缓存 header 时会发生什么。

Fiddler 的缓存响应检查器将帮助您了解给定响应的缓存方式。

关于http - 更正 HTTP 响应 header 以在内容过期后导致 304,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3782625/

相关文章:

php - 通过单击 jquery 链接强制下载 Word 文档、pdf、xls 等

html - Firefox 中 DIV 的位置有时不正确

http - 对于已知不存在的资源,最合适的 HTTP 响应代码是什么?

http - 强制 Jetty 进行 301 重定向

java - 使用 GWT ScriptInjector 加载脚本时如何设置 CacheHeaders?

caching - 几天后 Jenkins 停止提供静态文件

algorithm - LRU缓存算法的复杂度

c# - 如何检查 HttpContext.Current.Response 是否有现有的 Header?

http - tomcat http 请求中止但 https 正常

XML 回车符在发布后消失了