2017-07-31 4 views
0

Pour la première fois, j'ai dû envelopper un script CGI. J'ai des problèmes avec les navigateurs (à la fois Chrome et Firefox) ne reconnaissant pas l'en-tête Content-Length et indiquant la taille "inconnu" pour les utilisateurs.Les navigateurs ne reconnaissaient pas l'en-tête Content-Length lors de l'utilisation d'apache et de cgi

enter image description here

Quand je teste cela avec linux trop wget, l'outil reconnaît la taille très bien.

Lorsque je teste manuellement si openssl s_client -connect-je obtenir les en-têtes suivants:

La sortie précise du serveur Web est la suivante:

HTTP/1.1 200 OK 
Date: Sun, 30 Jul 2017 20:12:20 GMT 
Server: Apache/2.4.25 (Ubuntu) mod_fcgid/2.3.9 OpenSSL/1.0.2g 
Content-Disposition: attachment; filename=foo.000000000G-000000001G.foofile.txt; 
Content-Length: 501959790 
Vary: Accept-Encoding 
Content-Type: text/plain;charset=utf-8 

Quelqu'un peut-il suggérer ce manque/mal formaté?

Répondre

0

Cracked finalement.

Cela était dû au fait qu'Apache faisait quelque chose d'inattendu. Apache compresse la sortie du script CGI à la volée (envoi avec Content-Encoding: gzip). Cela modifie la taille du fichier, mais Apache ne peut pas savoir combien il va changer quand il envoie l'en-tête. Les fichiers sont 1/Go chacun de sorte qu'il ne peut pas/ne cache pas le contenu gzipped avant qu'il ne commence à envoyer ne peut donc pas connaître la taille du fichier. Cela signifie qu'il doit passer à Transfer-Encoding: chunked

Une façon de résoudre ce problème est de définir Content-Encoding: none dans l'en-tête, ce qui empêche Apache de compresser le contenu. Cela signifie que les fichiers de 1/2 Go prennent beaucoup plus de temps à envoyer.

Un autre pourrait être de gzip manuellement le contenu de mon script cgi et de définir Content-Encoding: gzip et Content-Length: <gzipped size>. Cela me demandera de travailler sur la taille compressée avant de l'envoyer.