#http #mime-types
#http #mime-типы
Вопрос:
Во время тестирования некоторого кода HTTP-сервера я заметил кое-что странное: если я вернусь Content-Type: text/plain
, браузеры не будут отображать содержимое в виде обычного текста. Вместо этого они, похоже, предполагают, что сервер должен быть неправильно настроен, и вместо этого они пытаются определить тип содержимого.
Например, если я возвращаю содержимое файла PNG, но с Content-Type: text/plain
:
- FireFox и IE9 оба просматривают расширение URL. Если он заканчивается на
.png
, они отображают его как изображение. Если нет (например, если я возвращаю то же содержимое с URL-адреса, который заканчивается на.xyz
), мне предлагается сохранить файл. - Chrome и Opera просматривают содержимое файла, определяют, что это PNG, и отображают его как изображение.
Конечно, не имеет смысла возвращать PNG, как text/plain
в рабочей среде; но если я проверяю, возвращает ли мой сервер правильное Content-Type
значение, мешает ошибочное поведение браузеров. Плюс это просто глупо, что вызывает у меня любопытство, есть ли способ обойти это.
Есть ли способ — с другим Content-Type
или дополнительным HTTP-заголовком или чем-то еще — чтобы я мог сообщить браузеру: «Покажите это как текст, нет, на самом деле, я действительно знаю, что я делаю»?
Ответ №1:
См https://datatracker.ietf.org/doc/html/draft-ietf-websec-mime-sniff-03#section-4 для контекста.
В некоторых пользовательских интерфейсах добавление в качестве пользовательского параметра, такого как
текст / обычный; imeanit=да
может помочь.
Некоторые версии IE поддерживают
X-Content-Type-Options: nosniff
см http://msdn.microsoft.com/en-us/library/gg622941(v=vs.85).aspx
Комментарии:
1.
X-Content-Type-Options: nosniff
работает в Chrome (v14) и IE (v9).Content-Type: text/plain; imeanit=yes
работает в FireFox (v7). Комбинация получает все, кроме Opera, но поскольку, похоже, нет соглашения о том, какой спецификации следовать или как ей следовать, похоже, что это настолько близко к ответу, насколько я собираюсь получить. Спасибо!
Ответ №2:
Какие данные вы на самом деле возвращаете? Вы уверены, что он полагается на URL-адрес, или сервер игнорирует ваш запрос на изменение типа содержимого? Вы проверили заголовки, которые видит браузер? Если вы действительно отправляете png как «текст», я думаю, что браузеры поступают правильно, определяя фактический тип данных, поскольку вы, вероятно, вызываете исключения в их процедурах рендеринга текста.
Комментарии:
1. Отредактировано, чтобы объяснить, почему я уверен, что он полагается на URL. Фактическое содержимое — это необработанные байты из файла PNG. Да, я изучил заголовки (используя
curl --head
).2. Ну, я не могу сказать вам авторитетно, но я подозреваю, что ответ заключается в том, что вы не можете требовать , чтобы браузер что-либо делал. Кроме того, если вы найдете обходной путь для определенного браузера, он, вероятно, не будет работать для всех из них.