Les en-tĂȘtes HTTP sont importants pour contrĂŽler la façon dont le cache et les navigateurs traitent votre contenu. Mais beaucoup d'entre eux sont utilisĂ©s de maniĂšre incorrecte ou sans signification, dĂ©pensant des ressources supplĂ©mentaires Ă un moment critique du chargement de la page, et ils peuvent ne pas fonctionner comme vous le pensez. Dans une sĂ©rie d'articles sur les meilleures pratiques, nous allons d'abord examiner les titres inutiles.
La plupart des dĂ©veloppeurs connaissent les en-tĂȘtes HTTP importants et utiles. Les plus connus sont
Content-Type
et
Content-Length
, ce sont des en-tĂȘtes presque universels. Mais rĂ©cemment, des en-tĂȘtes tels que
Content-Security-Policy
et
Strict-Transport-Security
ont été utilisés pour augmenter la
Strict-Transport-Security
et
Link rel=preload
pour améliorer les performances. Malgré la large prise en charge des navigateurs, seuls quelques-uns les utilisent.
Dans le mĂȘme temps, il existe de nombreux titres extrĂȘmement populaires qui ne sont gĂ©nĂ©ralement pas nouveaux et peu utiles. Nous pouvons le prouver avec l'aide de
HTTP Archive , un projet géré par Google et parrainé par Fastly, qui télécharge 500 000 sites chaque mois à l'aide de
WebPageTest et télécharge les résultats sur
BigQuery .
Voici les 30 en-tĂȘtes de rĂ©ponse les plus populaires selon HTTP Archive (en fonction du nombre de domaines dans l'archive que chaque en-tĂȘte affiche), et une estimation approximative de l'utilitĂ© de chacun d'eux:
Titre | Demandes | Domaines | Statut |
---|
date | 48779277 | 535621 | Protocole requis |
type de contenu | 47185627 | 533636 | Généralement requis par le navigateur |
serveur | 43057807 | 519663 | En option |
longueur du contenu | 42388435 | 519118 | Utile |
derniĂšre modification | 34424562 | 480294 | Utile |
cache-control | 36490878 | 412943 | Utile |
etag | 23620444 | 412370 | Utile |
encodage de contenu | 16194121 | 409159 | Requis pour le contenu compressé |
expire | 29869228 | 360311 | En option |
alimenté par x | 4883204 | 211409 | En option |
pragma | 7641647 | 188784 | En option |
x-frame-options | 3670032 | 105846 | En option |
access-control-allow-origin | 11335681 | 103596 | Utile |
x-content-type-options | 11071560 | 94590 | Utile |
lien | 1212329 | 87475 | Utile |
l'Ăąge | 7401415 | 59242 | Utile |
x-cache | 5275343 | 56889 | En option |
protection x-xss | 9773906 | 51810 | Utile |
strict-transport-security | 4259121 | 51283 | Utile |
via | 4020117 | 47102 | En option |
p3p | 8282840 | 44308 | En option |
attendre-ct | 2685280 | 40465 | Utile |
contenu-langue | 334081 | 37927 | Controverse |
x-aspnet-version | 676128 | 33473 | En option |
accĂšs-contrĂŽle-autoriser-informations d'identification | 2804382 | 30346 | Utile |
x-robots-tag | 179177 | 24911 | Peu importe pour les navigateurs |
compatible x-ua | 489056 | 24811 | En option |
access-control-allow-methods | 1626129 | 20791 | Utile |
en-tĂȘtes-de-contrĂŽle-d'accĂšs | 1205735 | 19120 | Utile |
Examinons les en-tĂȘtes facultatifs, pourquoi nous n'en avons pas besoin et que faire Ă ce sujet.
Vanity (serveur, alimenté par x, via)
Vous pouvez ĂȘtre trĂšs fier de votre choix de logiciel serveur, mais la plupart des gens s'en foutent. Dans le pire des cas, ces en-tĂȘtes peuvent divulguer des donnĂ©es sensibles, ce qui facilite l'attaque de votre site.
Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid
La RFC7231 vous permet d'inclure l'en-tĂȘte du serveur dans la rĂ©ponse du serveur, indiquant le logiciel spĂ©cifique sur le serveur qui est utilisĂ© pour fournir le contenu. Le plus souvent, il s'agit d'une chaĂźne comme "apache" ou "nginx". Bien que le titre soit autorisĂ©, il est facultatif et n'est pas particuliĂšrement utile aux dĂ©veloppeurs ou aux utilisateurs finaux. Cependant, il s'agit aujourd'hui du troisiĂšme en-tĂȘte de serveur HTTP le plus populaire sur Internet.
X-Powered-By
est le titre le plus populaire qui n'est défini par aucune norme et a un objectif similaire: il indique généralement la plate-forme d'application sur laquelle le serveur s'exécute. Les réponses les plus populaires incluent "ASP.net", "PHP" et "Express". Encore une fois, cela n'apporte aucun avantage tangible et se produit simplement.
Peut-ĂȘtre plus controversĂ© peut ĂȘtre considĂ©rĂ© comme
Via
. Il est nécessaire (
selon la RFC7230 ) d'ajouter Ă la
demande chaque proxy via lequel la demande passe - pour identifier le proxy. Il peut s'agir du nom d'hĂŽte proxy, mais le plus souvent d'un identifiant gĂ©nĂ©rique comme "vegur", "vernis" ou "squid". Supprimer (ou ne pas ajouter) un tel en-tĂȘte peut entraĂźner un
cycle de transfert de proxy . Mais il est intéressant qu'il soit également ajouté en réponse au chemin de retour vers le navigateur - et ici, il remplit simplement une fonction d'information: aucun navigateur n'en fait quoi que ce soit, il est donc suffisamment sûr pour s'en débarrasser si vous le souhaitez.
Normes obsolĂštes (P3P, Expire, Options X-Frame, Compatible X-UA)
Une autre catĂ©gorie d'en-tĂȘtes est celle qui provoque rĂ©ellement un effet dans le navigateur, mais (dĂ©jĂ ) n'est pas la meilleure façon d'obtenir cet effet.
P3P: cp="this is not a p3p policy"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge
P3P
est une petite chose amusante. Je n'avais aucune idĂ©e de ce que c'Ă©tait. Encore plus drĂŽle, l'un des contenus les plus courants de l'en-tĂȘte P3P est «Ce n'est pas une rĂšgle P3P». Eh bien, c'est ça ou pas?
Ici, l'histoire remonte Ă
une tentative de normalisation des rĂšgles de confidentialitĂ© lisibles par machine . Il y avait un dĂ©saccord sur la façon d'afficher les donnĂ©es dans les navigateurs, et un seul navigateur a implĂ©mentĂ© la prise en charge de cet en-tĂȘte - Internet Explorer. Mais mĂȘme en elle, P3P n'a eu aucun effet visuel pour l'utilisateur; il devait juste ĂȘtre prĂ©sent pour permettre l'accĂšs aux cookies tiers dans des frames. Certains sites dĂ©finissent mĂȘme des rĂšgles de non-conformitĂ© P3P, comme dans l'exemple ci-dessus, bien que cela soit
trĂšs discutable .
Inutile de dire que la lecture des cookies tiers est gĂ©nĂ©ralement une mauvaise idĂ©e, donc si vous ne le faites pas, vous n'avez pas besoin de dĂ©finir l'en-tĂȘte
P3P
!
Expires
tout simplement incroyablement populaire étant donné que
Cache-Control
est supĂ©rieur Ă
Expires
depuis plus de 20 ans. Si l'en
Cache-Control
tĂȘte
Cache-Control
contient la directive
max-age
, alors tout en-tĂȘte
Expires
dans la mĂȘme rĂ©ponse est ignorĂ©. Mais un grand nombre de sites dĂ©finissent ces deux en-tĂȘtes, et
Expires
définit le plus souvent la date
Thu, 01 Dec 1994 16: 00: 00 GMT
, afin que le contenu ne soit pas mis en cache. Bien sĂ»r, il est plus facile de copier la date Ă
partir des spécifications .

Mais il n'est tout simplement pas nĂ©cessaire de le faire. Si vous avez un en-tĂȘte
Expires
avec une date du passé, remplacez-le simplement par:
Cache-Control: no-store, private
(
no-store
est une directive trop stricte pour ne pas écrire de contenu dans un stockage persistant, vous pouvez donc préférer
no-cache
pour de meilleures performances, par exemple, pour naviguer en arriĂšre / en avant ou reprendre les onglets en veille dans un navigateur)
Certains outils de validation de site vous conseilleront d'ajouter un en
X-Frame-Options
tĂȘte
X-Frame-Options
avec une valeur de 'SAMEORIGIN'. Il indique aux navigateurs que vous refusez d'envoyer du contenu à un cadre sur un autre site: en rÚgle générale, c'est une bonne défense contre le
dĂ©tournement de clics . Mais le mĂȘme effet peut ĂȘtre obtenu avec un autre en-tĂȘte avec un support plus cohĂ©rent et un comportement plus fiable:
Content-Security-Policy: frame-ancestors 'self'
Il y a un avantage supplĂ©mentaire ici, car vous devez toujours donner l'en-tĂȘte CSP pour d'autres raisons (plus Ă leur sujet plus tard). Probablement, Ă notre Ă©poque, vous pouvez vous passer
X-Frame-Options
.
Enfin, dans IE9, Microsoft a introduit un "mode de compatibilitĂ©" qui rendait la page Ă l'aide du moteur IE8 ou IE7. MĂȘme en mode normal, le navigateur pensait qu'une ancienne version du moteur pourrait ĂȘtre nĂ©cessaire pour un rendu correct. Ces heuristiques ne fonctionnaient pas toujours correctement et les dĂ©veloppeurs pouvaient les remplacer en utilisant l'en
X-UA-Compatible
tĂȘte ou la balise Meta
X-UA-Compatible
. En fait, cela est devenu une partie standard de nombreux frameworks comme Bootstrap. Or cette rubrique est pratiquement inutile: la proportion de navigateurs qui la comprennent est trÚs faible. Et si vous soutenez activement le site, il est trÚs peu probable qu'il utilise des technologies qui lanceront le mode de compatibilité.
Débogage des données (version X-ASPNet, X-Cache)
à certains égards, il est surprenant que certaines des rubriques les plus populaires ne soient mentionnées dans aucune norme. Essentiellement, cela signifie que des milliers de sites Web ont en quelque sorte accepté d'utiliser une certaine rubrique d'une certaine maniÚre.
X-Cache: HIT
X-Request-ID: 45a336c7-1bd5-4a06-9647-c5aab6d5facf
X-ASPNet-Version: 3.2.32
X-AMZN-RequestID: 0d6e39e2-4ecb-11e8-9c2d-fa7ae01bbebc
En fait, ces rubriques "inconnues" n'ont pas Ă©tĂ© inventĂ©es par les dĂ©veloppeurs. En rĂšgle gĂ©nĂ©rale, ce sont des artefacts de l'utilisation de certaines infrastructures de serveur, logiciels ou services de fournisseurs spĂ©cifiques (par exemple, le dernier en-tĂȘte est typique d'AWS).
L'en
X-Cache
tĂȘte
X-Cache
ajoute rapidement (et d'autres CDN), ainsi que d'autres en-tĂȘtes spĂ©cifiques tels que
X-Cache-Hits
et
X-Served-By
. Lorsque le débogage est activé, d'autres éléments sont ajoutés, par exemple
Fastly-Debug-Path
et
Fastly-Debug-TTL
.
Ces en-tĂȘtes ne sont reconnus par aucun navigateur et leur suppression n'affectera pas du tout l'affichage des pages. Mais comme ils peuvent vous fournir au dĂ©veloppeur des informations utiles, vous pouvez les enregistrer.
Malentendu (Pragma)
Je ne m'attendais pas Ă ce qu'en 2018 je
Pragma
mentionner l'en-tĂȘte
Pragma
, mais selon les archives HTTP, il est toujours en tĂȘte (11Ăšme place). Non seulement il a Ă©tĂ© dĂ©clarĂ© obsolĂšte en 1997, mais il n'a jamais Ă©tĂ© conçu comme un en-tĂȘte de rĂ©ponse, mais uniquement dans le cadre d'une demande.
Pragma: no-cache
NĂ©anmoins, il est si largement utilisĂ© comme en-tĂȘte de rĂ©ponse que certains navigateurs le reconnaissent mĂȘme dans ce contexte. Mais aujourd'hui, il n'y a presque aucune chance que quelqu'un comprenne
Pragma
dans le contexte de la réponse, mais ne comprend pas
Cache-Control
. Si vous souhaitez désactiver la mise en cache, tout ce dont vous avez besoin est
Cache-Control: no-store, private
.
Non-navigateurs (X-Robots-Tag)
Une rubrique de notre top 30 n'est pas une rubrique pour le navigateur.
X-Robots-Tag
conçu pour les robots tels que les robots Google ou Bing. Puisqu'il est inutile pour un navigateur, vous pouvez définir une telle réponse uniquement aux demandes des robots. Ou vous décidez que cela rend les tests difficiles ou viole les conditions d'utilisation du moteur de recherche.
Bugs
Enfin, il vaut la peine de terminer par une mention honorable de simples erreurs. L'en-tĂȘte
Host
est logique dans la
demande , mais s'il apparaĂźt dans la rĂ©ponse, votre serveur n'est probablement pas configurĂ© correctement (et je voudrais savoir comment). Cependant, 68 domaines dans l'archive HTTP renvoient un en-tĂȘte
Host
dans leurs réponses.
Suppression d'en-tĂȘtes sur un serveur CDN Edge
Heureusement, si votre site fonctionne rapidement avec nous, la suppression des en-tĂȘtes est assez simple Ă l'aide de
VCL . Si vous souhaitez que l'Ă©quipe de dĂ©veloppement soit vraiment utile pour le dĂ©bogage, mais que cela soit cachĂ© au grand public, cela peut facilement ĂȘtre fait Ă l'aide de cookies ou de l'en-tĂȘte HTTP entrant:
unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;
if (!req.http.Cookie:debug && !req.http.Debug) {
unset resp.http.X-Amzn-RequestID;
unset resp.http.X-Cache;
}
Dans le
prochain article, je parlerai des meilleures pratiques pour les titres vraiment nécessaires et comment les activer sur le serveur de périphérie CDN.