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

HTTP响应头中的Expires: 0Expires: -1什么区别? RFC 2616定义了无效的date格式,特别是包括值“0” 已过期 。 但是,某些服务器(例如www.google.de)回复“ Expires: -1

比使用-1超过0还是有优势,甚至这是一些破碎的HTTP客户端所需要的吗?

问题在于Internet Explorer(尤其是旧版本)处理Expires头的失效方式。 IE使用Trident布局引擎和WinINET API来处理HTTP请求。 正如你可能知道的Expires可以在HTTP标题中指定

 Expires: 0 

或在元标记

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

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

如果WinINET下载带有无效Expires头的响应(例如,不包含有效HTTPDATE值的响应),并且没有其他caching指令,则会在一小时前将文档标记为过期。 三叉戟,但是,没有这样的逻辑。 如果您指定了无效时间,则Trident会抓取当前时间戳并将其用作到期。 如果遇到Pragma:no-cache指令,Trident也会使用当前时间戳。 如果用户在处理HTTP / 404的同一时间尝试重新导航到当前文档,则现有caching项的错误更新的到期将导致该请求被视为新鲜的。 如果用户点击刷新button或F5,caching将被绕过,404页面将被显示。

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

Expires:-1 Expires头文件指定何时应该认为内容已过时。 值-1表示内容立即过期,在重新显示之前必须重新请求。 http://www.httpwatch.com/httpgallery/headers/

max-age = 0简单地告诉caching(和用户代理),响应过时了,所以他们应该在使用caching副本之前重新validation响应(例如使用If-Not-Modified头),而不-cache告诉他们在使用caching副本之前必须重新validation。

欲了解更多信息,请查看Protocols/HTTP/1.1/rfc2616.pdf

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

请注意:在某些浏览器中,可能会额外提供1小时或使用默认的到期时间进行兑现。

1 – 最好给它一个正确的旧date,如:

 <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" /> 

对于正式的工作,我build议给当前的date时间元过期,而不是使用旧的固定date(这将使像谷歌这样的search引擎标记您的网站旧,不会显示在顶部)

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

 <meta http-equiv="Expires" content="<?php echo gmdate('D, d MYH:i:s', time()-3600) . ' GMT' ?>" /> 

PS:为了以防万一,我给了一个小时。