If-Modified-Since IE9 传递的 HTTP 标头包含长度?

Posted

技术标签:

【中文标题】If-Modified-Since IE9 传递的 HTTP 标头包含长度?【英文标题】:If-Modified-Since HTTP header passed by IE9 includes length? 【发布时间】:2012-09-19 13:16:13 【问题描述】:

请澄清 IE9 传递的这个奇怪的 If-Modified-Since 标头

在我的 ASP.NET 4.0 Web 应用程序中,我有一个通用处理程序 (.ashx),它为存储在数据库中的图像提供服务。为了效率,我正在处理一些与缓存相关的标头并传递缓存信息。

我在尝试解析 If-Modified-Since 标头内容时经常遇到 DateTime 解析错误,通常来自 IE9。原来它正在发送这样的东西:

格林威治标准时间 2011 年 11 月 28 日星期一 16:34:52;长度=8799

我通过使用正则表达式去除最后一部分来处理这个问题。但我很好奇:它指的是什么长度,它有什么用?是请求的 URL 的缓存数据的大小吗?

【问题讨论】:

我有点困惑。听起来您说 IE9 正在发送 Last-Modified 标头,但客户端通常没有任何理由发送该标头。这是 Web 服务器应发送给客户端的标头。在任何情况下,根据HTTP protocol specification,“;长度=8799”不应该是该标头的一部分,所以我认为有一些行为不端的代码错误地将其设置在某处。 对不起。这是If-Modified-Since 标头。我会纠正这个问题。哦! 【参考方案1】:

根据 Squid 代理邮件列表中的 old post:

If-Modified-Since 的长度参数是 Netscape 的扩展 HTTP/1.0,旨在提高 If-Modified-Since 的准确性,以防万一 一个文档在同一秒内更新两次。

HTTP/1.1 解决了 通过 ETag 标头和 If-None-Match 以更好的方式解决同样的问题。

我猜 IE 在某个时候调整了这个扩展并将它留在里面。

【讨论】:

【参考方案2】:

这似乎是标题字段的旧 Netscape 扩展(请参阅an ancient discussion on http-wg);尽管它似乎实际上违反了HTTP/1.0 和HTTP/1.1 规范(这个想法(在功能上)被 ETag 标头取代)。不知道 IE9 是否/为什么发送它以及在什么特定条件下发送它(我猜只有缓存标头的特定组合会触发它)。

我想最好的解决方案是在分号之后删除任何内容,这通常在 HTTP 中用于分隔标头中的扩展参数(参见例如the Accept header)。

【讨论】:

扩展参数只适用于某些头部字段,而日期不是其中之一。 Mormegli - 只是澄清解析为“;”是您通常不能对字段值进行的操作

以上是关于If-Modified-Since IE9 传递的 HTTP 标头包含长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何让ajaxfileupload.js支持IE9,IE10,并可以传递多个参数

Vimeo API 未响应“If-Modified-Since”标头

Symfony2 删除生产中的“if-modified-since”参数

在“If-Modified-Since”HTTP 标头中使用客户端生成的时间

HTTP的请求头标签 If-Modified-Since

在请求中发送“if-modified-since”标头