HTTP Expires标头值“0”和“-1”

时间:2012-07-06 07:06:46

标签: http

HTTP响应标头中Expires: 0Expires: -1之间有什么区别? RFC 2616定义无效的日期格式,尤其是包含值“0”,因为已过期。但是,某些服务器(例如www.google.de)会回复Expires: -1

使用-1优于0是否有优势,或者甚至是某些损坏的HTTP客户端需要这样做?

3 个答案:

答案 0 :(得分:31)

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

Expires: 0

或在元标记中

<meta http-equiv="Expires" content="0">

在第二种情况下,Expires成为响应内容的一部分(不是标题内容),因此它将是processed by Trident and then propagated to WinINET

  

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

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:3)

使用&#34; -1&#34;无效,将被视为&#34; 0&#34;。它根本不应该触发重载。

注意:在某些浏览器中,它可能会额外提供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" />

对于正式工作,我建议给予 meta的当前日期时间到期而不是使用旧的固定日期(这将使像谷歌这样的搜索引擎将您的网站标记为旧版本而不会在顶部显示)

2-如果您的后端是PHP,您可以像:

一样处理它
<meta http-equiv="Expires" content="<?php echo gmdate('D, d M Y H:i:s', time()-3600) . ' GMT' ?>" />

PS:我提前一小时给予以防万一。