Quels en-têtes de réponse HTTP doivent être envoyés du serveur au client?
Je travaille pour optimiser les en-têtes de réponse HTTP afin de minimiser la surcharge de réponse HTTP. Je sais que les "frais généraux" sont quelque peu exagérés, mais j'aime une sortie nette.
Je vois beaucoup de sites Web, qui envoient des en-têtes de cache redondants.
par exemple.
Il est redondant de spécifier à la fois Expires
et Cache-Control: max-age
, ou pour spécifier les deux Last-Modified
et ETag
.
Cela dépend de ce que vous définissez comme étant requis: il n'y a pas de champs d'en-tête qui doivent être envoyés avec chaque réponse quelles que soient les circonstances, mais il y a des champs d'en-tête que vous avez vraiment devrait envoyer. Le seul champ d'en-tête qui se rapproche est Date
, mais même il a des circonstances dans lesquelles il n'est pas requis.
Dans le langage de RFC 2119 , le terme [~ # ~] doit [~ # ~] signifie que quelque chose est un l'exigence de la spécification et ne répondant pas à l'exigence serait invalide. Aucun champ d'en-tête n'est défini par les RFC 72 , 7231 , 7232 , 72 , 7234 , ou 7235 qui [~ # ~] doit [~ # ~] être envoyé par un serveur Origin dans tous les cas.
Les en-têtes suivants, par exemple, peuvent être omis (bien que vous devriez probablement les envoyer):
Un serveur d'origine NE DOIT PAS envoyer un champ d'en-tête
Date
s'il n'a pas d'horloge capable de fournir une approximation raisonnable de l'instance actuelle en temps universel coordonné. Un serveur d'origine PEUT envoyer un champ d'en-têteDate
si la réponse est dans la classe de codes d'état 1xx (informationnel) ou 5xx (erreur serveur). Un serveur d'origine DOIT envoyer un champ d'en-têteDate
dans tous les autres cas.
Notez la dernière phrase de la citation. Le champ d'en-tête Date
[~ # ~] doit [~ # ~] être envoyé si le serveur Origin est capable de fournir un " approximation raisonnable "de la date en UTC, mais rien n'empêche un serveur de se déformer.
Un serveur d'origine PEUT générer un champ
Server
dans ses réponses.
Mis à part [un nombre fini de cas prédéfinis], en l'absence de
Transfer-Encoding
, un serveur d'origine DEVRAIT envoyer unContent-Length
champ d'en-tête lorsque la taille du corps de la charge utile est connue avant d'envoyer la section d'en-tête complète.
Au sujet de Content-Length
et Transfer-Encoding
, notez qu'aucun des deux ne peut être envoyé, auquel cas la longueur de la réponse est "déterminée par le nombre d'octets reçus avant la fermeture de la connexion par le serveur".
Si un
Content-Type
le champ d'en-tête n'est pas présent, le destinataire PEUT supposer soit un type de support deapplication/octet-stream
(RFC2046, section 4.5.1) ou examinez les données pour déterminer leur type.
Il existe des circonstances dans lesquelles des en-têtes particuliers peuvent être requis, par exemple:
Connection: close
dans chaque réponse qui n'a pas de code d'état 1xx.Allow
dans un 405 (Méthode Non autorisé).WWW-Authenticate
champ d'en-tête contenant au moins un défi.Cela dépend des spécificités de la réponse, mais généralement, une réponse d'un serveur Origin doit avoir:
et soit Content-Length, Transfer-Encoding ou Connection: close.
Si vous voulez faire de la mise en cache, ajoutez Cache-Control (par exemple, avec max-age); Expire n'est généralement plus nécessaire. Si vous souhaitez que les clients puissent valider, ajoutez Last-Modified ou ETag.