Веб-сайт IIS отправляет несколько заголовков типа содержимого для zip-файлов
У нас проблема с сервером IIS5.
Когда некоторые пользователи / браузеры нажимают, чтобы загрузить файлы.zip, бинарный текст иногда отображается в окне браузера. Желаемое поведение для файла, чтобы загрузить или открыть с помощью соответствующего почтового приложения.
Первоначально мы подозревали, что в файле был установлен неправильный заголовок типа содержимого. Специалист IIS подтвердил, что файлы.zip обслуживаются IIS с помощью mime-типа "application/x-zip-compress".
Однако проверка HTTP-пакетов с использованием Wireshark показывает, что запросы на zip-файлы возвращают два заголовка Content-Type.
- Content-Type: text / html; кодировка = UTF-8
- Content-Type: application / x-zip-сжатый
Есть идеи, почему IIS отправляет два заголовка типа контента? Этого не происходит для обычных файлов HTML или изображений. Это случается с ZIP и PDF.
Есть ли какое-то конкретное место, где мы можем обратиться к специалисту IIS? Или есть файл конфигурации, который мы можем проверить?
6 ответов
Какое программное обеспечение было установлено на сервере для работы с файлами.zip? Похоже, что IIS получает MIME-переводы из реестра, возможно, используемое вами zip-программное обеспечение зарегистрировало MIME-тип. Это не объясняет, почему IIS отвечает двумя заголовками типа содержимого, поэтому любой фильтр ISAPI и другая таблица Mime являются подозрительными.
Я верю - и я могу ошибаться, что заголовок http 1.1 отправляет несколько определений заголовков, а наиболее конкретный имеет приоритет.
так что в вашем примере здесь он отправляет 2 text/html, а затем application/x-zip-commercial, поэтому второй будет наиболее конкретным - если это не может быть обработано на клиенте, то используется более общий (первый в этом случае) -
Я прочитал этот http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html и тому подобное указывает на то, что вы говорите - хотя я не уверен, что это действительно так.
Конечно я могу быть совершенно не прав здесь
Я столкнулся с подобной проблемой. Я тестировал загрузки на IIS 6 и не мог понять, почему заархивированный файл с именем test.zip отображался как текст в IE8 (это было нормально в других браузерах, где он будет загружаться).
Затем я понял, что для теста я сжал очень маленький текстовый файл. Я предполагаю, что IE понюхал файл, увидел текст (который был в значительной степени несжатый из-за небольшого размера) и решил, что это обычный текст.
Я попытался еще раз с большим файлом, и приглашение загрузки в IE8 появилось нормально.
Может не относиться к вашему делу, но подумал, что упомяну это.
Тим
Убедитесь, что у вас нет фильтров ISAPI или HTTP-модулей ASP.net, настроенных для перезаписи заголовков. Если они не проверят, существует ли заголовок, он будет добавлен, а не заменен. Некоторое время назад у нас были проблемы с внутренним модулем аутентификации, который неправильно обновлял заголовки, поэтому мы получили два заголовка авторизации, один из IIS и один из нашего модуля.
Это может быть связано с этой статьей базы знаний. Предполагается, что IIS может распаковывать уже заархивированный файл, но некоторые браузеры просто переходят к дополнительному приложению, предоставляющему вам неверные данные (так как они были заархивированы дважды). Если вы измените тип mime расширения zip на application/octet-stream, этого может не произойти.
Похоже, может быть проблема с вашей конфигурацией IIS. Однако это не возможно сказать из вашего поста, если это так.
Вы можете настроить MIME-типы на нескольких уровнях в IIS. Мои знания IIS 5 немного устарели, насколько я помню, это поведение одинаково для IIS 6. Я пытался смоделировать это в среде IIS 6, но только когда-либо получал один тип MIME в зависимости от принятого заголовка
Я установил заголовок для zip-файлов на сайте в application/x-zip-compress, а для файла, который у меня есть explicity, установил его
tinyget -srv:dev.24.com -uri:/helloworld.zip -tbLoadSecurity
WWWConnect::Connect("server.domain.com","80")
IP = "127.0.0.1:80"
source port: 1581
REQUEST: **************
GET /helloworld.zip HTTP/1.1
Host: server.domain.com
Accept: */*
RESPONSE: **************
HTTP/1.1 200 OK
Content-Length: 155
Content-Type: text/html
Last-Modified: Wed, 29 Apr 2009 08:43:10 GMT
Accept-Ranges: bytes
ETag: "747da786a6c8c91:0"
Server: Microsoft-IIS/6.0
Date: Wed, 29 Apr 2009 10:47:10 GMT
PK??
? ? ? helloworld.txthello worldPK??¶
? ? ? ? helloworld.txtPK?? ? ? < 7 ? hello world sample
WWWConnect::Close("server.domain.com","80")
closed source port: 1581
Однако я не чувствую, что это доказывает много. Однако возникает несколько вопросов:
- Что это за карты MIME, которые были настроены на сервере (спросите у администратора сервера файл metabase.xml, и тогда вы сможете убедиться, что он не пропустил некоторые настройки)
- Эти клиенты находятся в сети, которая находится под вашим контролем? Наверное, нет, мне интересно, какой прокси-сервер может находиться между вашим сервером и клиентами?
- Как выглядит журнал IIS, для этого запроса я особенно заинтересован в заголовке Accept.
- Интересно, что скрипач покажет?