8 votes

L'en-tête Content-Length n'existe pas

J'ai un serveur nginx installé sur Linux. Lorsque j'envoie une requête avec curl, le fichier Content-Length est absent de la réponse.

Le fichier 1.php est :

<?php
   echo "hello";
?>

L'exemple de demande est le suivant :

curl api.mysite.com/taxi/1.php -i

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Wed, 17 Sep 2014 06:16:00 GMT
Content-Type: text/html; charset=utf8
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.4-14+deb7u14
Age: 0
X-Cache: MISS from cache.turonnet.uz
Transfer-Encoding: chunked
Connection: keep-alive

Comment puis-je réparer ça ?

0 votes

J'ai essayé sur Apache et j'ai le même problème. Essayez avec wget -S

0 votes

@TRiG : Le problème est évident. Il suffit de remplacer <? mit ?>

20voto

Sven Points 95985

content-length ne peut pas être défini si le Transfer-Encoding est fixé à chunked . Au moment où il envoie les en-têtes, le serveur ne sait pas combien de données il va finalement envoyer. Chaque morceau possède son propre champ d'en-tête de longueur (voir la section RFC ).

Si vous y pensez, contrairement à un fichier HTML statique, le serveur web n'a aucun moyen de savoir combien de données seront générées par un script PHP. Il pourrait soit mettre en cache le fichier généré et l'envoyer après que le script soit terminé, soit l'envoyer par morceaux pendant qu'il est généré. Cette dernière solution est préférée surtout pour les script avec une grande sortie et un long temps d'exécution.

1 votes

Si vous connaissez la longueur de la sortie, par exemple pour le téléchargement d'un fichier, vous pouvez définir l'en-tête content-length avec PHP. header fonction.

0 votes

@SvW, Merci pour votre réponse. Mais, la même chose fonctionne sur le serveur Apache, c'est-à-dire que ce dernier envoie le message Content-Length .

1voto

Antoine Leclair Points 5818

Nginx ne connaît pas la longueur car le php génère du contenu dynamique. Vous pouvez d'abord écrire dans le tampon de sortie de php, puis définir manuellement le champ d'en-tête avant de vider le tampon.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X