HTTP Expires标头值"0"和"-1"

sca*_*cai 52 http

HTTP响应头之间Expires: 0和之间有什么区别Expires: -1RFC 2616定义无效日期格式,特别是包括值"0"作为已经过期.但是,有些服务器(例如www.google.de)会回复Expires: -1.

是否有使用-1over 的优势,0或者甚至是某些破坏的HTTP客户端需要它?

Pav*_*sky 31

问题在于Internet Explorer(特别是旧版本)处理的Expires标头的无效程度.IE使用Trident布局引擎和WinINET API来处理HTTP请求.您可能知道可以在HTTP标头中指定Expires

Expires: 0
Run Code Online (Sandbox Code Playgroud)

或在元标记中

<meta http-equiv="Expires" content="0">
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,Expires成为响应内容的一部分(不是标题内容),因此它将由Trident处理,然后传播到WinINET:

如果WinINET下载具有无效Expires标头的响应(例如,不包含有效HTTPDATE值的响应)并且没有其他缓存指令,则它会将文档标记为在一小时前过期.然而,三叉戟没有这样的逻辑.如果指定了无效时间,Trident将获取当前时间戳并将其用作到期时间.如果遇到Pragma:no-cache指令,Trident也将使用当前时间戳.如果用户尝试在处理HTTP/404的同一秒内重新导航到当前文档,则现有缓存条目的错误更新到期将导致对该请求将其视为新鲜.如果用户点击"刷新"按钮或F5,将绕过缓存并显示404页面.

换句话说,Expires: 0并不总是导致资源过期,因此应该避免Expires: [some valid date in the past]使用,而应该使用它.

  • 3赞成?有人甚至读过这个答案吗?根据这篇文章,`Expires:-1`和`Expires:0`之间没有*差异. (11认同)
  • 那是对的.本文仅解释HTML元素中错误处理的*Expires = 0*.在HTTP标头中没有关于*Expires = -1*或其他错误处理的Expires值的单词. (4认同)

小智 10

Expires:-1 Expires标头指定何时应将内容视为过期.值-1表示内容立即过期,并且必须在再次显示之前重新请求. http://www.httpwatch.com/httpgallery/headers/

max-age = 0只是告诉缓存(和用户代理)响应从一开始就是陈旧的,因此在使用缓存副本之前,它们应该重新验证响应(例如,使用If-Not-Modified标头),而不是-cache告诉他们在使用缓存副本之前必须重新验证.

欲了解更多信息,请访问http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf

  • 谢谢,但我的问题是关于`Expires:0`和`Expires:-1`之间的区别. (2认同)

Moh*_*asr 8

使用“-1”是无效的,将被视为与“0”相同。它根本不应该触发重新加载。

注意:在某些浏览器中,它可能会额外提供 1 小时或使用默认过期时间进行缓存。

1-最好给它一个正确的旧日期,例如:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
Run Code Online (Sandbox Code Playgroud)

对于正式工作,我建议将当前日期时间设置为元过期时间,而不是使用旧的固定日期(这将使谷歌等搜索引擎将您的网站标记为旧网站,而不是显示在顶部)

2- 如果您的后端是 PHP,您可以像这样处理它:

<meta http-equiv="Expires" content="<?php echo gmdate('D, d M Y H:i:s', time()-3600) . ' GMT' ?>" />
Run Code Online (Sandbox Code Playgroud)

PS:为了以防万一,我提前一小时。