Вот что меня озадачивает.
Я работаю над Javascript, который должен анализировать данные XML, и я использую 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>
Я проверил настройку MIME для моего сервера Apache, и он настроен на отправку файлов xml как «application / 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
в мои директивы для этого виртуального сервера. Когда я затем получаю свой XML-документ с расширением .tweets, 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
IE с файлом .tweets:
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, я также получаю правильный тип содержимого.
Так что же могло помешать и изменить «application / xml» на «text / html» только для Internet Explorer? Мне не хотелось бы полагаться на свои обходные пути. Я подумал о mod-deflate, но я отключил его, и результаты такие же.
Любые идеи?
(PS - XML, который я включаю, это всего лишь образец, поэтому длины содержимого не совпадают
Думаю, я понял это.
Похоже, что IE кэширует данные AJAX GET таким образом, что их трудно (невозможно?) Очистить. Возможно, в какой-то момент у меня был настроен xml как text / xml, но я так не думаю. По сути, IE продолжал использовать кэшированные результаты для этого XML-файла поверх фактических результатов сервера. Это также объясняет, почему заголовки HTTP выглядели так странно (например, нет информации о сервере). Или возможно, что кеш всегда создает текст / html (я отказался от дальнейших тестов).
Мое решение: я добавил '? Hidecache =' + метку времени в конец URL-адреса в запросе GET. Теперь IE получает правильные заголовки HTTP, которые я установил на сервере.
Вау, я ненавижу Internet Explorer. Сколько часов разработки тратится на поиск обходных путей для этого ужасного поведения?