2011-04-09 60 views
0

所以這裏有一些令我費解的東西。奇怪的HTTP響應頭只發送到Internet Explorer 8

我正在研究一個需要解析XML數據的Javascript,我正在使用jQuery的$ .ajax來獲取和解析數據。除了使用Internet Explorer 8進行測試(它也可能是7和9的問題)以外,它在任何地方都能很好地工作。在IE瀏覽器,我得到解析錯誤。我安裝了一個console.log來檢查HTTP標頭。這是我從Chrome中獲得Windows XP和什麼我從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配置,它被設置爲發送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文件,而不是,我得到這些響應頭 -

鉻與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 

因此,從我所知道的情況來看,使用我有限的Apache知識,似乎原始XML文件僅在IE沒有正確的內容類型的情況下發送,儘管我已將它配置爲發送'application/xml'。 Chrome正在接收正確的內容類型。當我使用PHP時,Apache似乎遵循我的意願併發送'application/xml',因爲這是我在腳本中加蓋的內容。 IE瀏覽器沒有與Chrome相同的標題也很奇怪嗎?例如「服務器」缺失。

那麼,可能會有什麼可能阻礙Internet Explorer的「application/xml」變爲「text/html」呢?我討厭不得不依賴PHP腳本來輸出我的XML數據。我想到mod-deflate,但我禁用它,結果是一樣的。

任何想法?

(PS - 我包括XML僅僅是一個示例,因此,內容的長度不匹配)

+0

所以...這是一個網絡服務器管理問題?更適合服務器故障? – Kissaki 2011-04-09 16:36:03

+0

更多樂趣和興奮,我改變了我的XML文件的擴展.tweets,我把一個「將AddType應用/ XML的tweets」到我的Apache2指示該目錄。 Internet Explorer爲.tweets文件獲取正確的內容類型!所以什麼地方,什麼似乎中斷Apache的標題爲Internet Explorer,但只能用.xml文件(也許其他標準類型)。對不起,我不知道關於serverfault.com。我想我會在那裏嘗試。 – JonMcL 2011-04-09 16:44:58

回答

1

所以我想我明白了。

看來,IE緩存AJAX GET數據以這樣一種方式,它是硬(不可能?)來清除它。也許我在某個時候將xml配置爲text/xml,但我不這麼認爲。基本上,IE繼續在實際的服務器結果上使用該XML文件的緩存結果。這也解釋了爲什麼HTTP頭看起來很奇怪(例如沒有服務器信息)。或者緩存可能總是生成text/html(我放棄了進一步的測試)。

我的解決辦法: 我添加了一個+時間戳在GET請求中的URL的結尾「avoidcache =?」。現在IE獲取我在服務器上設置的正確的HTTP標頭。

哇做我討厭IE瀏覽器。浪費了多少開發時間,爲它的可怕行爲創造解決方法?

+0

深和完整恨IE =(讓我們看看,如果邊緣做更好的東西 – 2015-10-07 17:47:09

0

IE可以發送不同的HTTP請求,要求text/html的主要或唯一的和另一方面chrome也是application/xml。你檢查了HTTP請求標頭嗎?

另外,您是如何檢查HTTP數據包的?也許IE刪除服務器標籤? (無論如何,大多數情況下,這是毫無用處的)。

正如您在PHP中測試的那樣,設置內容類型,並且它工作正常,這是一個web服務器設置和/或HTTP-Request區別。檢查這些。

+0

我正在通過jQuery的'complete'事件檢查$ .ajax()函數。我會嘗試找出一種方法來獲取請求標題。 – JonMcL 2011-04-09 16:46:09