Est-il nécessaire de spécifier le type de contenu dans l'en-tête de réponse http?

8

À l'exception du document html, actuellement tous les fichiers (css, javascript et images) servis depuis mon serveur web ne spécifient pas le content-typedans l'en-tête de réponse http. Il m'arrive de le remarquer car j'ai l'intention de supprimer l' typeattribut dans ma scriptbalise et ma linkbalise, mais je suis tombé sur cette réponse qui dit ce qui suit:

Le type MIME est également envoyé via l'en-tête HTTP Content-Type, donc l'utilisation de type = "text / css" ne serait que des octets supplémentaires.

Débordement de question
la source
2
Je pense que vous devez spécifier Content-Type pour que les scripts s'exécutent dans IE. Il s'agit d'empêcher les utilisateurs malveillants de télécharger des scripts sur des sites Web de partage d'images.
Brendon
@Brendon, merci d'avoir souligné les implications de sécurité. Y a-t-il un autre aspect à noter, en termes de sécurité, en supposant qu'aucun utilisateur n'a téléchargé de contenu?
Débordement de questions
1
Êtes-vous sûr que votre serveur n'envoie pas d'en- Content-Typetête pour ces fichiers? Si vous consultez la réponse des fichiers servis depuis le cache de votre navigateur, vous ne verrez probablement pas d'en- Content-Typetête.
MrWhite
La plupart des serveurs enverront les types de mime corrects par défaut, donc à moins que vous ne configuriez explicitement votre serveur pour ne pas l'envoyer, je parie que les fichiers sont envoyés avec le type de mime correct.
DisgruntledGoat
1
@ w3d, merci pour votre commentaire. Je me rends compte après avoir revérifié que ce que je lis provient en fait de l'en-tête de demande d'un 304 not modifiedfichier. Pas exactement le cache, mais le type de contenu est supprimé de l'en-tête. Désactiver le cache, tout redevient normal.
Débordement de questions

Réponses:

7

Oui . Par le protocole HTTP, clause 7.2.1 :

«Tout message HTTP / 1.1 contenant un corps d'entité DEVRAIT inclure un champ d'en-tête Content-Type définissant le type de média de ce corps. Si et seulement si le type de média n'est pas donné par un champ Content-Type, le destinataire PEUT tenter de deviner le type de média en inspectant son contenu et / ou la ou les extensions de nom de l'URI utilisées pour identifier la ressource.

Alors oui, les en-têtes de réponse doivent contenir un en- Content-Typetête pour toutes les données de réponse (appelé «entité-corps» dans le protocole, souvent «fichier» en langage commun). S'il est omis, le navigateur est autorisé à faire ses propres suppositions sur le type de données qu'il a obtenues. Dans de nombreux contextes, le risque de suppositions erronées est négligeable, mais ce n'est pas une bonne excuse pour violer le protocole.

Des attributs comme type=text/csset type=text/javascriptn'ont pas été nécessaires, sauf par certaines spécifications formelles, voire utiles. Même si un serveur envoie par exemple incorrectement des données CSS sans Content-Type, les navigateurs traiteront les données comme CSS si <link rel=stylesheet ...>c'est l'élément qui a provoqué la demande. C'est l' relattribut qui compte dans ce cas.

Jukka K. Korpela
la source