Назад | Перейти на главную страницу

Странные заголовки ответа HTTP отправляются только в Internet Explorer 8

Вот что меня озадачивает.

Я работаю над 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. Сколько часов разработки тратится на поиск обходных путей для этого ужасного поведения?