奇怪的 HTTP 响应标头仅发送到 Internet Explorer 8

奇怪的 HTTP 响应标头仅发送到 Internet Explorer 8

这是我觉得很困惑的事情。

我正在开发一个需要解析 XML 数据的 Javascript,并使用 jQuery 的 $.ajax 来获取和解析数据。除了使用 Internet Explorer 8 进行测试时(在 7 和 9 上可能也会出现问题),它在任何地方都运行良好。在 IE 上,我遇到了解析错误。我安装了 console.log 来检查 HTTP 标头。以下是我从 Windows XP 上的 Chrome 和 IE 上获得的结果 -

铬合金:

Date: Sat, 09 Apr 2011 16:06:24 GMT
Connection: Keep-Alive
Content-Length: 2283
Last-Modified: Sat, 09 Apr 2011 15:59:12 GMT
Server: Apache/2.2.14 (Ubuntu)
ETag: "48048-8eb-4a07e6c693400"
Content-Type: application/xml
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=97

IE8:

LOG: ETag: "48048-8eb-4a07d7a3cbe40"
Keep-Alive: timeout=15, max=97
Content-Type: text/html
Content-Length: 2283
Last-Modified: Sat, 09 Apr 2011 14:51:29 GMT

这是 XML 文档的示例:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <tweet>
        <name>name</name>
        <message>message</message>
        <avatar>avatar</avatar>
    </tweet>
    <tweet>
        <name>name</name>
        <message>message</message>
        <avatar>avatar</avatar>
    </tweet>
</root>

我检查了 Apache 服务器的 MIME 配置,发现它设置为以“application/xml”格式发送 xml 文件。因此,奇怪的是,它向 Chrome 发送了“application/xml”内容类型,但 IE 收到的内容类型却是“text/html”。

因此我编写了一个简单的 PHP 脚本:

<?php
header('Content-type: application/xml; charset=UTF-8');
echo '<?xml version="1.0" encoding="UTF-8" ?>';
?>
<root>
    <tweet>
        <name>name</name>
        <message>message</message>
        <avatar>avatar</avatar>
    </tweet>
    <tweet>
        <name>name</name>
        <message>message</message>
        <avatar>avatar</avatar>
    </tweet>
</root>

当我修改 Javascript 来检索 PHP 文件而不是 XML 文件时,我得到了以下响应标头:

Chrome 与 PHP:

Date: Sat, 09 Apr 2011 16:10:39 GMT
X-Powered-By: PHP/5.2.10-2ubuntu6.7
Connection: Keep-Alive
Content-Length: 2102
Server: Apache/2.2.14 (Ubuntu)
Content-Type: application/xml; charset=UTF-8
Keep-Alive: timeout=15, max=97

IE 与 PHP:

LOG: X-Powered-By: PHP/5.2.10-2ubuntu6.7
Content-Length: 2102
Keep-Alive: timeout=15, max=100
Content-Type: application/xml; charset=UTF-8

我刚刚发现了更多奇怪的东西。我把

AddType application/xml tweets

进入我针对该虚拟服务器的指令。当我使用 .tweets 扩展名获取 XML 文档时,IE 确实在标头中获得了正确的内容类型!事实上,标头看起来更像 Chrome 版本——

Chrome 中的 .tweets 文件:

Connection: Keep-Alive
Content-Length: 2102
Last-Modified: Sat, 09 Apr 2011 16:33:46 GMT
Server: Apache/2.2.14 (Ubuntu)
ETag: "48048-836-4a07ee807ee80"
Content-Type: application/xml
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100

带有 .tweets 文件的 IE:

LOG: Date: Sat, 09 Apr 2011 16:38:56 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Sat, 09 Apr 2011 16:33:46 GMT
ETag: "48048-836-4a07ee807ee80"
Accept-Ranges: bytes
Content-Length: 2102
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/xml

因此,据我所知,凭借我有限的 Apache 知识,似乎原始 XML 文件没有正确的内容类型,仅发送给 IE,即使我已将其配置为发送“application/xml”。Chrome 正在接收正确的内容类型。当我使用 PHP 时,Apache 似乎按照我的意愿发送“application/xml”,因为这是我在脚本中标记的内容。IE 没有与 Chrome 相同的所有标头,这是否也很奇怪?例如缺少“服务器”。当我添加自定义扩展名 .tweets 并配置为使用 application/xml 时,我也会获得正确的内容类型。

那么,可能是什么原因导致只针对 Internet Explorer 将“application/xml”更改为“text/html”?我不想依赖我的变通方法。我想到过 mod-deflate,但我禁用了它,结果还是一样。

有任何想法吗?

(PS - 我所包含的 XML 只是一个示例,因此内容长度不匹配

答案1

所以我想我已经明白了。

IE 似乎以某种方式缓存了 AJAX GET 数据,以至于很难(不可能?)清除它。也许我曾经将 xml 配置为 text/xml,但我不这么认为。基本上,IE 继续使用该 XML 文件的缓存结果,而不是实际的服务器结果。这也解释了为什么 HTTP 标头看起来如此奇怪(例如没有服务器信息)。或者缓存可能一直在生成 text/html(我放弃了进一步的测试)。

我的解决方案:我在 GET 请求的 URL 末尾添加了 '?avoidcache=' + 时间戳。现在 IE 可以获取我在服务器上设置的正确 HTTP 标头。

哇,我太讨厌 Internet Explorer 了。为解决其糟糕的行为而浪费了多少开发时间?

相关内容