En-tĂȘtes HTTP inutiles

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:

TitreDemandesDomainesStatut
date48779277535621Protocole requis
type de contenu47185627533636Généralement requis par le navigateur
serveur43057807519663En option
longueur du contenu42388435519118Utile
derniĂšre modification34424562480294Utile
cache-control36490878412943Utile
etag23620444412370Utile
encodage de contenu16194121409159Requis pour le contenu compressé
expire29869228360311En option
alimenté par x4883204211409En option
pragma7641647188784En option
x-frame-options3670032105846En option
access-control-allow-origin11335681103596Utile
x-content-type-options1107156094590Utile
lien121232987475Utile
l'Ăąge740141559242Utile
x-cache527534356889En option
protection x-xss977390651810Utile
strict-transport-security425912151283Utile
via402011747102En option
p3p828284044308En option
attendre-ct268528040465Utile
contenu-langue33408137927Controverse
x-aspnet-version67612833473En option
accĂšs-contrĂŽle-autoriser-informations d'identification280438230346Utile
x-robots-tag17917724911Peu importe pour les navigateurs
compatible x-ua48905624811En option
access-control-allow-methods162612920791Utile
en-tĂȘtes-de-contrĂŽle-d'accĂšs120573519120Utile

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.

Source: https://habr.com/ru/post/fr412813/


All Articles