Existe-t-il une limite de longueur d’en-tête HTTP?

J’ai une application Web qui ajoute des informations contextuelles aux objects XmlHttpRequest à l’aide de l’API setRequestHeader . J’utilise un nom d’en-tête personnalisé (par exemple X-Foo) et une valeur structurée JSON . Il ne fait pas partie du corps de l’URL QuerySsortingng ou POST car il s’agit d’informations méta sur la requête.

Y a-t-il une limite de taille pratique à la valeur d’en-tête? Si mon JSON est tronqué, il devient non analysable. Je suis très préoccupé par les limites d’Apache 2, Tomcat 6 et IIS 7. J’ai effectué une recherche sur Google pour la longueur de l’en-tête http , mais beaucoup de résultats semblent datés. Il y a quelques commentaires pertinents dans Quelle taille peut avoir une chaîne d’agent utilisateur? mais pas aussi spécifique que je voudrais.

Edit: Je viens de parcourir cette question similaire – Maximum sur les valeurs d’en-tête http?

Oui, mais les limites sont configurables et dépendent de la plate-forme. Par exemple, Tomcat a une limite par défaut de 8K. Je crois que IIS 6, pas sûr sur IIS 7, a une limite de 16K. Je me suis heurté à cela lors de l’utilisation de l’authentification Windows intégrée pour plusieurs sites Web. Il s’avère que mon jeton de sécurité était trop gros lorsqu’il était encodé dans l’en-tête. Heureusement, ceux-ci sont configurables. Les parameters de registre pour IIS sont disponibles à l’ adresse http://support.microsoft.com/kb/820129 . Je crois que les parameters clés à modifier sont MaxFieldLength (par taille d’en-tête) et MaxRequestBytes (taille totale de la demande).

Bien que chaque logiciel de serveur Web présente certaines limitations, il existe une différence, qu’il y ait une limite pour la ligne de requête HTTP plus les champs d’en-tête ou pour chaque champ d’en-tête.

Voici un résumé:

  • Apache 1.3 , 2.0 , 2.2 , 2.3 : 8190 octets (pour chaque champ d’en-tête)
  • IIS:
    • 4.0 : 2097152 Octets (pour la ligne de demande plus les champs d’en-tête)
    • 5.0 : 131072 octets , 16384 octets avec Windows 2000 Service Pack 4 (pour la ligne de demande plus les champs d’en-tête)
    • 6.0 : 16384 octets (pour chaque champs d’en-tête)
  • Matou:
    • 5.5.x / 6.0.x : 49152 octets (pour les champs de ligne de demande et d’en-tête)
    • 7.0.x : 8190 octets (pour la ligne de demande plus les champs d’en-tête)

Donc pour conclure: Pour être accepté par tous les serveurs Web ci-dessus, la ligne de demande d’une requête plus les champs d’en-tête ne doivent pas dépasser 8190 octets . C’est également la limite pour chaque champ d’en-tête (voire même moins).

Pour Apache, j’ai trouvé cet article Server Limits for Apache Security qui répertorie ces directives:

# allow up to 100 headers in a request LimitRequestFields 100 # each header may be up to 8190 bytes long LimitRequestFieldsize 8190 

Pour Nginx, la directive large_client_header_buffers de HttpCoreModule contrôle ceci:

La ligne de demande d’en-tête la plus longue ne doit pas non plus dépasser la taille d’un tampon, sinon le client reçoit l’erreur “Demande incorrecte” (400).

Par défaut, la taille d’un tampon est égale à la taille de la page, en fonction de la plate-forme soit 4K ou 8K

Bien que vous puissiez configurer le serveur, il est peu probable que vous puissiez réellement configurer tout le chemin à travers les pare-feu, les équilibreurs de charge et les proxys. Garder la taille d’en-tête petite permet d’éviter les problèmes.

Flash Media Server 4.5 dispose d’une limite de longueur d’en-tête par défaut très courte, ce qui peut simplement empêcher le serveur de répondre, en particulier dans les cas où la charge de cookies est modérée.

Voir: Configuration et administration de Flash Media Server 4.5: Configuration du serveur Configuration du serveur HTTP Apache: spécifiez la longueur de ligne d’en-tête HTTP maximale

Dans le fichier Flash Media Server Adaptor.xml, l’élément MaxHeaderLineLength détermine la taille de l’en-tête HTTP que le serveur peut gérer. La valeur par défaut de MaxHeaderLineLength est de 1024 octets. Certains navigateurs envoient un en-tête supérieur à 1024 octets. Dans ce scénario, Apache renvoie une réponse vide. Pour résoudre ce problème, configurez MaxHeaderLineLength sur 8192.

Remarque: Par défaut, la taille maximale de l’en-tête HTTP Apache est de 8 Ko (8190 octets plus un retour chariot).

Ici, si la taille de l’en-tête de Flash Media Server est limitée par un autre utilisateur.