En-têtes HTTP personnalisés : les conventions de nommage
Plusieurs de nos utilisateurs nous ont demandé d'inclure des données relatives à leur compte dans le en-têtes HTTP de demandes que nous les envoyer, ou même les réponses qu'ils reçoivent de notre API.
Qu'est-ce que la convention générale pour ajouter des en-têtes HTTP personnalisés, en termes de de nommage, format... etc.
Aussi, n'hésitez pas à poster toute utilisation intelligente de ces que vous avez trébuché sur le web; Nous essayons de mettre en œuvre ce à l'aide de ce qui est mieux là-bas qu'une cible 🙂
- Sachez que le pare-feu peut supprimer la réponse champs d'en-tête. Certains supprimer tout ce qui n'est pas mentionné dans la RFC 2616 (juin 1999, HTTP 1.1). Du côté du client doit toujours être utilisable sans les nouveaux champs.
- Notez que le commentaire de @stesch ne s'applique pas lors de l'utilisation de HTTPS.
- Notez que le commentaire de @code_dredd est une légende urbaine. Pare-feu peuvent filtrer le contenu HTTPS. Voir howtoforge.com/filtering-https-traffic-with-squid et watchguard.com/help/docs/wsm/xtm_11/en-us/content/en-us/...
- Étant donné que votre article s'avère essentiel de la procuration en quelque chose de semblable à un MiTM (il faut chiffré de connexion du client et fait ensuite une nouvelle) alors bien sûr, vous pouvez faire presque n'importe quoi, mais qui fait nie le chiffrement de la proxy PoV b/c c'est de décrypter le client du contenu lui-même. Dans ce cas, à partir du proxy PoV, en gros, c'est comme si vous n'étiez pas à l'aide de HTTPS dans la 1ère place...
Vous devez vous connecter pour publier un commentaire.
La recommandation
estétait pour démarrer leur nom de "X-". E. g.X-Forwarded-For
,X-requested-with
. Cela est également mentionné dans une.o. l'article 5 de RFC 2047.Mise à jour de 1: en juin 2011, la première L'IETF projet a été posté pour déprécier la recommandation de l'aide de "X-" préfixe pour les non-standard des en-têtes. La raison en est que lorsque les en-têtes standard avec le préfixe "X" deviennent la norme, en supprimant le "X" préfixe des sauts de rétro-compatibilité, forçant l'application des protocoles à l'appui de deux noms (E. g,
x-gzip
&gzip
équivalent aujourd'hui). Donc, la recommandation officielle est juste le nom de leur sensiblement sans le "X" préfixe.Mise à jour 2: en juin 2012, la dépréciation de la recommandation d'utiliser le "X" préfixe est devenu officiel que RFC 6648. Ci-dessous sont des villes de pertinence:
Note que "ne DEVRAIT PAS" ("découragés") n'est pas la même chose que "ne DOIT PAS" ("interdit"), voir aussi RFC 2119 pour un autre spec sur ces mots clés. En d'autres termes, vous pouvez continuer à l'utiliser "X" préfixe en-têtes, mais il n'est pas officiellement recommandé plus et vous pouvez certainement pas le document comme si ils sont à la norme publique.
Résumé:
if (header == "x-gzip")
àif (header == "x-gzip" || header == "gzip")
. Comme pour votre analogie, voici une autre: c'est comme les militaires en disant: "Oh, c'est pénible de changer quelqu'un du soldat au Général. Donc, à partir de maintenant, vous êtes tous les Généraux. Maintenant, nous n'avons pas besoin de faire beaucoup de travail"X-
préfixe. Je suis contre, mais aller de l'avant et de le faire. Pour les en-têtes otoh, que, ne pas le laisser tomber. Il est facile de regarder et d'aller, "oh, c'est non-standard; je peux l'ignorer" vs "il y a ceux non-standardX-
en-têtes, et puis il y a un je ne reconnais pas; puis-je l'ignorer en toute sécurité?"application/x-foo-bar
jusqu'à ce que le type MIME est enregistré, ou cette nouvelle dépréciation de remplacer le type MIME processus d'inscription?X-
pour s'assurer qu'aucun affrontement avec les en-têtes publics (grâce à RFC6648, qui traite avec les en-têtes publics), et en plus certainement utiliser arbitrairement privé de préfixe. Pour les en-têtes publics, ne pas utiliser deX-
en toutes circonstances.X-<RAND_NUM>-<NAME>
, puisque, si deux personnes souhaitent mettre en œuvre les mêmes fonctionnalités ou des fonctionnalités différentes qui partagent le même "sensible" par le nom, ils sont analysées alors qu'ils sont les normes de la piste et l'on peut devenir la norme.X-Data-____
similaire à HTML5 "data____" attribut, il devrait être parfaitement bien et compatible en amont, elle ne pourra pas changer le corps de la réponse de la taille et vous pouvez fournir presque n'importe quel type de données, si c'est "bizarre regardant" encoder (soit base64, ou urlcomponent ou même fuir) 🙂X-
ou pas et il n'a pas d'importance.Foobar
ne commence pas avecX-
; est-il un en-tête standard ou pas? Test-2)Xkcd
ne commence pas avecX-
; est-il un en-tête standard ou pas?Verbosity
en-tête?La question porte re-lecture. La véritable question posée n'est pas semblable à un fournisseur de préfixes dans les propriétés CSS, où l'épreuve de l'avenir et de penser à la prise en charge des fournisseurs et des normes officielles est approprié. La question posée est la plus proche de choix de requête d'URL noms de paramètre. Personne ne devrait s'inquiéter de ce qu'ils sont. Mais le nom de l'espacement de la coutume est parfaitement valide -- et commun, et corriger-chose à faire.
Justification:
C'est sur conventions entre les développeurs personnalisé, spécifique à l'application en-têtes -- "données pertinentes à leur compte" -- qui n'ont rien à voir avec les vendeurs, les organismes de normalisation, ou de protocoles à être mis en œuvre par des tiers, à l'exception que le développeur en question a besoin tout simplement d'éviter les noms d'en-tête qui peut avoir d'autres de l'utilisation prévue par les serveurs, les procurations ou des clients. Pour cette raison, le "X-Gzip/Gzip" et "X-Forwarded-For/Forwarded-For" exemples donnés sont sans objet. La question se pose à propos des conventions dans le cadre d'une API privée, qui s'apparente à l'URL de la requête de paramètre conventions de nommage. C'est une question de préférence et le nom de l'espacement; des préoccupations au sujet de "X-ClientDataFoo" être pris en charge par un proxy ou un vendeur, sans le "X" sont clairement mal placée.
Il n'y a rien de spécial ni de magique à propos de la "X-" préfixe, mais il est utile de préciser que c'est un en-tête personnalisé. En fait, RFC-6648 et coll aider à renforcer le cas pour l'utilisation d'un "X" préfixe, -- comme les fournisseurs de clients HTTP et serveurs d'abandonner le préfixe -- votre application spécifique, privé de l'API, de données à caractère personnel-le passage-le mécanisme est en train de devenir encore meilleure isolation contre l'espace de nommage des collisions avec le petit nombre de officiel réservés noms d'en-tête. Cela dit, ma préférence personnelle et de la recommandation est d'aller une étape plus loin et de faire, par exemple, "X-ACME-ClientDataFoo" (si votre widget société est "ACME").
À mon humble avis l'IETF spec est insuffisamment précis pour répondre à l'OP de la question, parce qu'il ne fait pas la distinction entre les différents cas d'utilisation: (A) les fournisseurs de l'introduction de nouvelles applicables à une échelle mondiale des fonctions comme "Forwarded-For", d'une part, par rapport à (B) les développeurs d'applications en passant spécifiques à l'application des chaînes de/entre le client et le serveur. La spec ne concerne que lui-même avec l'ancien, (Un). La question ici est de savoir si il existe des conventions pour (B). Il y a des. Ils comporter le regroupement des paramètres par ordre alphabétique, et en les séparant de nombreuses normes pertinentes en-têtes de type (A). À l'aide de la "X" ou "X-ACME-" préfixe est pratique et légitime pour (B), et n'entre pas en conflit avec (Un). Les plus vendeurs de cesser d'utiliser "X" pour (A), le plus proprement distincts (B) deviendra.
Exemple:
Google (qui portent un peu de poids dans les différents organismes de normalisation) sont, à compter d'aujourd'hui, 20141102 dans cette édition légères à ma réponse -- actuellement à l'aide de "X-Mod-Pagespeed" pour indiquer la version de son module Apache impliqués dans la transformation d'un donné de réponse. Est-on vraiment ce qui suggère que Google devrait utiliser "Mod-Pagespeed", sans le "X", et/ou demander à l'IETF pour bénir son utilisation?
Résumé:
Si vous utilisez des en-Têtes HTTP personnalisés (comme parfois-alternative appropriée pour les cookies) au sein de votre application pour transmettre des données vers/à partir de votre serveur, et ces en-têtes sont, explicitement, PAS destiné à être utilisé en dehors du contexte de votre demande, le nom de l'espacement avec un "X" ou "X-FOO-" préfixe est raisonnable, et de la commune, de la convention.
com.mycompany.headers.custom:somevalue
. Je ne trouve rien nulle part qui dit que vous ne pouvez pas utiliser les points dans les noms d'en-tête. Vous n'obtiendrez pas de collisions de cette façon.naming
mais pasformat
ce qui a été demandé et certainement correspond à la spécification HTTP. Vous êtes - pire encore - de nier ce fait. Voir Tom Anderson réponse ci-dessous: stackoverflow.com/a/3569667/2898712.ACMECO-WIDGET-FOO
sansX-
.Le format des en-têtes HTTP est défini dans la spécification HTTP. Je vais vous parler de HTTP 1.1, pour lequel la spécification est La RFC 2616. Dans la section 4.2, 'en-Têtes de Message", la structure générale d'un en-tête est défini:
Cette définition repose sur deux piliers, jeton et le TEXTE. Les deux sont définis dans la section 2.2, " Base de Règles. Jeton:
À son tour de se reposer sur CHAR, CTL et des séparateurs:
TEXTE est:
Où LWS est linéaire, espace blanc, dont la définition je ne vais pas reproduire, et OCTET est:
Il y a une note d'accompagnement de la définition:
Donc, deux conclusions. Tout d'abord, il est clair que l'en-tête nom doit être composé à partir d'un sous-ensemble de caractères ASCII - des caractères alphanumériques, certains signes de ponctuation, pas beaucoup d'autre. Deuxièmement, il n'y a rien dans la définition d'un en-tête valeur qui restreint à l'ASCII ou exclut les caractères 8 bits: il est explicitement composé d'octets, avec seulement des caractères de contrôle barrée (à noter que les caractères CR et LF sont considérés comme des contrôles). En outre, le commentaire sur le TEXTE de la production implique que les octets doivent être interprétés comme étant dans la norme ISO-8859-1, et qu'il existe un mécanisme d'encodage (qui est horrible, d'ailleurs) pour représenter les caractères en dehors de cet encodage.
Donc, pour répondre à @BalusC en particulier, il est clair que, selon la spécification, les valeurs d'en-tête sont en ISO-8859-1. J'ai envoyé la haute-8859-1 caractères (plus précisément, certaines voyelles accentuées en français) dans un en-tête de Tomcat, et les a interprétés correctement par Firefox, dans une certaine mesure, cela fonctionne en pratique comme en théorie (bien que ce fut un Lieu d'en-tête, qui contient une URL, et ces personnages ne sont pas légaux dans les Url, donc c'est effectivement illégal, mais sous une autre règle!).
Cela dit, je ne voudrais pas compter sur les ISO-8859-1 travail sur tous les serveurs, les serveurs proxy, et les clients, donc je m'en tiendrais aux ASCII comme une question de programmation défensives.
RFC6648 recommande que vous supposez que votre en-tête personnalisé "pourraient devenir normalisée, publique, couramment déployés, ou utilisable dans de multiples implémentations." Par conséquent, il recommande de ne pas préfixer par "X" ou d'autres constructions similaires.
Cependant, il existe une exception "où il est extrêmement peu probable que [votre titre] sera jamais normalisée." Une telle "mise en œuvre spécifique et privés-l'utilisation d'en-têtes, le RFC a dit un espace de noms comme un fournisseur préfixe est justifiée.
X-
préfixe parce qu'il est plus probable que quelque chose sans préfixe pourrait devenir standarized.La modification, ou plus correctement, ajoutant supplémentaire en-têtes HTTP est un excellent outil de débogage de code si de rien d'autre.
Lorsqu'une URL de requête renvoie une redirection ou une image il n'y a pas de code html "à la page" temporairement écrire les résultats de débogage de code à au moins pas celle qui est visible dans un navigateur.
Une approche consiste à écrire les données dans un fichier journal local et afficher ce fichier plus tard. Une autre consiste à ajouter temporairement des en-têtes HTTP qui reflète les données et les variables en cours de débogage.
J'ai régulièrement ajouter des en-têtes HTTP, comme X-fubar-somevar: ou X-tests-someresult: à tester des choses - et nous avons trouvé beaucoup de bugs qui, autrement, aurait été très difficile à retracer.
Le champ d'en-tête le nom de registre est définie dans RFC3864, et il n'y a rien de spécial avec "X".
Pour autant que je sache, il n'existe pas de lignes directrices pour le privé, les en-têtes; dans le doute, évitez-les. Ou regarder le HTTP Cadre de l'Extension (RFC 2774).
Il serait intéressant de mieux comprendre les cas d'utilisation, pourquoi ne pouvons-l'information doit être ajouté dans le corps du message?