61

HTTP响应标头中的Expires: 0和之间有什么区别?RFC 2616定义了无效的日期格式,特别是包括值 "0" as already expired。但是,一些服务器(例如www.google.de)回复为.Expires: -1Expires: -1

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

4

3 回答 3

33

问题在于 Internet Explorer(尤其是旧版本)如何处理无效的 Expires 标头。IE 使用Trident布局引擎和WinINET API 来处理 HTTP 请求。如您所知,可以在 HTTP 标头中指定 Expires

Expires: 0

或在元标记中

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

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

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

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

于 2012-07-06T18:38:38.360 回答
12

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

于 2015-03-10T06:02:01.850 回答
9

使用“-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" />

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

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

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

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

于 2017-09-09T11:43:33.943 回答