La taille d'un champ d'en-tête de demande dépasse la limite du serveur en raison de nombreuses valeurs If-None-Match

8

Voici un cas intéressant d'un client obtenant l'erreur "400 Bad Request" et apparemment incapable d'afficher une page d'accueil drupal hébergée sur Ubuntu 12.04.3 LTS en utilisant Apache / 2.2.22:

Mauvaise demande
Votre navigateur a envoyé une demande que ce serveur ne pouvait pas comprendre.
La taille d'un champ d'en-tête de demande dépasse la limite du serveur.

Sortie de reniflement de paquets:

...
T 2013/09/02 15:23:10.458167 ###.###.###.###:40027 -> ###.###.###.###:80 [A]
GET / HTTP/1.0.
If-None-Match: "1363160742-0", "1363165573-1", "1363175854-1", "1363175854-0", "1363179616-0", "1363181811-0", "1363239319-1", "1363255903-0", "1363259282-0", "1363263398-1", "1363274564-0", "1363329642-0", "1363332613-1", "1363333851-0", "1363599826-0", "1363678909-0", "1363684227-1", "1363699732-0", "1363755181-0", "1363765691-1", "1363767178-0", "1363780208-0", "1363787589-0", "1363795259-1", "1363852409-1", "1363863225-1", "1363928115-0", "1363951793-0", "1363951793-1", "1364133610-1", "1364187608-1", "1364187608-0", "1364203083-0", "1364208174-0", "1364214930-0", "1364219815-0", "1364274441-1", "1364280930-0", "1364280930-1", "1364286055-1", "1364298840-0", "1364298840-1", "1364360674-0", "1364364356-1", "1364381508-0", "1364385520-1", "1364460734-0", "1364882595-1", "1364903271-0", "1364967946-0", "1364967946-1", "1364981713-0", "1364985142-1", "1364992835-1", "1365061578-0", "1365065290-1", "1365076128-0", "1365141088-1", "1365167701-0", "1365171024-0", "1365402404-1", "1365402404-0", "1365411731-1", "1365416882-0", "1365476715-0", "1365487578-0", "1365488880-1", "1365503922-1", "1365514224-1", "1365579101-0", "1365580320-0", "1365582817-0", "1365584926-0", "1365589524-0", "1365608307-0", "1365649987-0", "1365682295-0", "1365685083-0", "1365770532-1", "1365770532-0", "1365844566-0", "1365996619-1", "1366093719-1", "1366093719-0", "1366115408-0", "1366180275-1", "1366186431-0", "1366196476-0", "13662669
...

À ce stade, je ne suis pas sûr à 100% s'il s'agit uniquement d'un client spécifique, mais l'erreur a été signalée par un utilisateur avec la chaîne d'agent utilisateur suivante:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/534.57.7 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.7

Maintenant, la question reste de savoir quoi faire, est-ce un problème de serveur ou simplement un client qui se comporte mal?

inetpro
la source
Ce n'est pas une question Ubuntu. Jetez un œil aux journaux Apache et utilisez-les pour obtenir de l'aide auprès de la communauté spécialisée.
Luís de Sousa
Je pensais que c'était peut-être un problème par défaut d'Ubuntu.
inetpro
1
Nous parlons d'un serveur Web fonctionnant sur Ubuntu - il n'est donc pas hors sujet en soi. Comme l'a suggéré @ LuísdeSousa, regardez /var/log/apache2/error.logpour trouver quelle limite a été violée.
guntbert
@ LuísdeSousa Nous prenons en charge toutes les parties du serveur Ubuntu ici. Pourquoi ne serait-ce pas une question Ubuntu?
Eliah Kagan
@guntbert la partie intéressante est que ni la demande ni l'erreur réelle ne sont jamais enregistrées dans les journaux apache. Il est enregistré dans le proxy inverse de Squid et je suppose que le proxy est en fait la cause
inetpro

Réponses:

11

Vous avez trouvé le problème. Certains agents utilisateurs et certaines demandes deviennent trop volumineux pour les valeurs par défaut du serveur Web. Cela semble être un problème stupide à rencontrer, mais cela continue de m'arriver nginx. Habituellement, quand il y a des noms de cookies stupides et des téléchargements en cours ... Quoi qu'il en soit ...

La solution consiste simplement à augmenter la limite de demande. Vous pouvez le faire globalement ou simplement pour votre site avec la LimitRequestFieldSizedirective :

LimitRequestFieldSize 32768

C'est une limite de 32 Ko (contre 8 Ko par défaut).

Oli
la source
C'est ce que je pensais mais je n'étais pas sûr de la taille recommandée. Merci!
inetpro
1
Augmenter LimitRequestFieldSizejusqu'à 32768n'a pas aidé.
inetpro
@inetpro Avez-vous redémarré Apache? Et est-ce dans un contexte suffisamment élevé? Cela ne fonctionnera pas dans un fichier .htaccess.
Oli
1
Avez-vous placé l'entrée dans l'hôte virtuel basé sur le prénom défini, ou dans un autre? La documentation indique: "Lorsque l'hébergement virtuel basé sur le nom est utilisé, la valeur de cette directive est extraite de l'hôte virtuel par défaut (premier répertorié) pour le NameVirtualHost auquel la connexion a été mappée.". Il semble que vous feriez mieux de le faire dans la configuration globale. Le problème avec le faire dans un hôte virtuel est que l'en-tête de demande contient lui-même le nom de l'hôte virtuel requis.
Robie Basak
2
LimitRequestFieldSize 65536LimitRequestLine 65536LimitXMLRequestBody 0⓸ ??? ⓹ℙℛṎℱỈ Ꭲ☕