Нужно ли указывать тип содержимого в заголовке ответа http?

8

За исключением html-документа, в настоящее время все файлы (css, javascript и изображения), обслуживаемые моим веб-сервером, не указываются content-typeв заголовке ответа http. Я случайно заметил это, поскольку намеревался удалить typeатрибут и из моего scriptтега, и из linkтега, но натолкнулся на ответ, который говорит следующее:

Тип MIME также отправляется через заголовок HTTP Content-Type, поэтому использование type = "text / css" будет только дополнительными байтами.

Вопрос переполнен
источник
2
Я считаю, что вам нужно указать Content-Type для сценариев, выполняемых в IE. Это сделано для того, чтобы злоумышленники не загружали скрипты на сайты обмена изображениями.
Брендон
@ Брендон, спасибо за указание на безопасность. Есть ли какой-либо другой аспект, который стоит отметить, с точки зрения безопасности, предполагая, что пользователь не загружал контент?
Вопрос переполнен
1
Вы уверены, что ваш сервер не отправляет Content-Typeзаголовок для этих файлов? Если вы просматриваете ответ от файлов, поданных из кэша вашего браузера, вы, вероятно, не увидите Content-Typeзаголовок.
MrWhite
Большинство серверов будут посылать правильные типы пантомимы по умолчанию, поэтому , если вы явно не установить сервер не отправить его, я держу пари , файлов будут быть отправлены с правильным типом пантомимы.
Рассерженная шлюха
1
@ w3d, спасибо за ваш комментарий. После перепроверки я понимаю, что то, что я читаю, на самом деле из заголовка запроса 304 not modifiedфайла. Не совсем кеш, но тип содержимого удаляется из заголовка. Отключая кеш, все снова выглядит нормально.
переполнение вопроса

Ответы:

7

Да . По протоколу HTTP, п. 7.2.1 :

«Любое сообщение HTTP / 1.1, содержащее тело объекта, ДОЛЖНО включать поле заголовка Content-Type, определяющее тип носителя этого тела. Если и только если тип мультимедиа не задан полем Content-Type, получатель МОЖЕТ попытаться угадать тип мультимедиа посредством проверки его содержимого и / или расширения имени URI, используемого для идентификации ресурса ».

Так что да, заголовки ответа должны содержать Content-Typeзаголовок для любых данных ответа (называемых в протоколе «entity-body», часто «file» на общем языке). Если он опущен, браузеру разрешается делать свои собственные дикие предположения о типе данных, которые он получил. Во многих случаях риск неправильных догадок незначителен, но это не является хорошим оправданием для нарушения протокола.

Атрибуты вроде type=text/cssи type=text/javascriptне были необходимы, за исключением некоторых формальных спецификаций или даже полезных. Даже если сервер неправильно отправляет, например, данные CSS без Content-Type, браузеры будут обрабатывать данные как CSS, если они <link rel=stylesheet ...>были элементом, вызвавшим запрос. Это relатрибут, который имеет значение в этом случае.

Юкка К. Корпела
источник