Статьи

IE Подводные камни: Запросы «contype» документа

В этой статье описывается немного странное поведение, которое было в Internet Explorer начиная с версии 4. Вы столкнетесь с проблемой, если будете использовать плагины или изображения SVG, например


<object type="image/svg+xml" data="image.svg"></object>

При анализе этого кода IE сделает два запроса GET:

  1. Первым является запрос типа контента (image / svg + xml), чтобы браузер мог вызывать приложение-обработчик внутри окна браузера. Этот запрос идентифицируется строкой пользовательского агента «contype».
  2. Вторым является запрос самого документа (который также должен возвращать правильный тип содержимого).

(Если вы все еще беспокоитесь о IE 4.x и 5.0.x, они делают дополнительный начальный запрос, чтобы получить тип контента и выполнить поиск в реестре, чтобы определить, какое приложение требуется.)

Ни один другой браузер не реализует этот процесс, но это происходит в каждой версии Internet Explorer, включая IE9.

К сожалению, это может привести к проблемам …

Большие документы
Если вы возвращаете большой документ, такой как PDF, первоначальный запрос типа контента будет задержан, если это займет более 10 секунд. Статические файлы, вероятно, не являются проблемой, поскольку ваш сервер может автоматически распознавать запрос «contype» и отвечать соответствующим образом. Однако, если вы генерируете документ, это увеличивает вероятность тайм-аута. В лучшем случае IE удваивает нагрузку на ваш сервер и искажает статистику.

Проверка пользовательского агента
Это проблема, с которой я столкнулся. Веб-приложения часто проверяют строку агента пользователя в целях безопасности, т. Е. Если агент пользователя изменяется между последующими запросами, кто-то может попытаться захватить сеанс — он становится недействительным, и пользователь выходит из системы.

Если вы генерируете SVG в типичном приложении MVC, IE делает следующие запросы для ресурса, содержащего этот образ:

  1. HTML-страница. Серверу передается стандартная строка агента пользователя MSIE (сеанс действителен).
  2. SVG-тип контента. Серверу передается агент пользователя «contype», который делает недействительным сеанс.
  3. Документ SVG. Серверу передается стандартная строка агента пользователя MSIE, но ничего не возвращается, поскольку сеанс больше недоступен.

Это сложная проблема для отладки, поскольку пользователь IE выходит из системы каждый раз, когда сталкивается со страницей с изображением SVG.

Контипное решение

Лучший способ предотвратить проблемы — обнаружить пользовательский агент «contype», вернуть соответствующий тип контента и отменить дальнейшую визуализацию. Например, в PHP:

 
if($_SERVER['HTTP_USER_AGENT'] == 'contype') {
	header('Content-Type: image/svg+xml');
	die();
}

Ugghh. Ни один другой поставщик не считает необходимым делать начальные запросы типа контента, поэтому будем надеяться, что Microsoft извлечет эту «функцию» из IE10.

Для получения дополнительной информации обратитесь к PRB: три запроса GET отправляются, когда вы извлекаете обслуживаемый контент подключаемого модуля .