web-dev-qa-db-fra.com

Comment puis-je désactiver le codage de transfert: Chunked in Apache avec des réponses HTTP / 1.1

J'ai une page mod_include (SSI) qui génère une sortie orthographique lors de l'encodage chunté lorsque demandé par un navigateur HTTP/1.1.

La page est une option de sortie à la demande d'un HTTP/1.0 (car la sortie n'est pas chuntée).

Comment puis-je dire Apache ne pas Pour utiliser un codage chunté lorsque demandé par un navigateur HTTP/1.1?

Plus d'informations: La sortie chuntée orthographiée est causée par la prise en charge de SendFile () activée sur une machine Solaris 5.10 avec un processeur SPARC. Désactiver Sendfile () Soutien provoque la disparition de ce problème; Cependant, j'essaie d'attraper ce bogue et de le réparer.

6
PP.

Si vous pré-spécifier la longueur du contenu, Apache n'aura pas à utiliser chunked. Sans la longueur de contenu, Apache n'a aucune option mais à l'utiliser.

Pour être clair: http/1.0 le gère car Apache se lit dans toute la réponse avant de l'envoyer, de sorte que cela sache à quel point cela sera grand. C'est hilarablement inefficace et lent et afaik, il n'y a aucun moyen d'activer cette logique pour les demandes HTTP/1.1, sauf en les forçant à http/1.0 (que vous ne voulez vraiment pas faire, n'est-ce pas? Si vous le faites? Si vous le faites? , la variable d'environnement à définir est "Dualgrade-1.0" )

10
BMDan

La réponse ci-dessus est incorrecte.

Si la demande est http/1.0, Apache ne tamponne jamais la réponse avant de l'envoyer (avec en-tête de longueur de contenu). Bien sûr, Apache pourrait faire cela, mais il y a une solution plus élégante que Apache utilise: elle répond avec "Connexion: fermeture" Close "et ferme la connexion dès qu'il envoie toutes les données.

Selon SPECT HTTP , la présence de "raccordement: fermeture" signifie que le client doit lire la connexion jusqu'à la fermeture de la connexion.

La solution à votre problème est de forcer Apache Traiter la demande comme http/1.0 en définissant la variable mentionnée Downgrade-1. . L'encodage de transfert chunté est une fonctionnalité HTTP/1.1 et Apache ne l'utilisera pas pour la demande HTTP/1.0.

Par exemple. Voici comment vous pouvez désactiver les réponses à presse pour les fichiers PHP:

++++++++++++
Apache.conf
++++++++++++

<Files *.php>
    SetEnv downgrade-1.0
</Files>
9
andreycpp

Apache Client va essayer de déterminer la taille du corps envoyé. Pré-0Specifiant "Longueur de contenu" entraînera une erreur sauf si vous utilisez des intercepteurs spéciaux.

Il vérifie l'entité qu'il envoie pour identifier s'il est chunté ou si la taille du corps (longueur de contenu) <0 et si elle est vraie, il utilise l'en-tête "codage de transfert = chunded". Si l'entité ne préfère pas le chunking et une longueur de contenu> -1 se trouve alors il utilise une en-tête de "longueur de contenu".

Typiquement, si la source du corps est une partie du corps MIME, il utilisera "codage de transfert" car un appel à la méthode de taille () renvoie -1 ainsi convertir la partie du corps MIME en une matrice d'octet fonctionnerait car elle retournera le nombre. d'octets dans le tableau.

0