2010-11-27 8 views
0

I) Mon serveur proxy transmet l'en-tête Accept-Encoding qu'il a reçu du client à mon serveur de contenu principal tel qu'il est. Les données reçues du serveur backend sont envoyées au navigateur demandeur en utilisant simplement PHP echo (sans traiter les en-têtes séparément). Cependant, les données sont affichées dans le navigateur en tant que données binaires brutes.PHP curl et gzip: le navigateur ne gère pas la réponse gzip

Si je ne transmets pas d'Accept-Encoding à mon serveur de contenu, alors tout va bien.

Étant donné que le navigateur accepte les données GZIP, pourquoi mon serveur proxy a-t-il besoin de le décoder? Pourquoi ne transmet-il pas directement les données gzip au navigateur? Plutôt que de manipuler les données sur un serveur proxy, y a-t-il un paramètre qui me manque pour que ça marche?


II) Sur la base des suggestions de stillstanding, j'ai essayé une nouvelle façon (mais maintenant je suis plus confus car il a ses propres problèmes) !.

J'utilisé

.... 
curl_setopt($curl_handle, CURLOPT_HEADER, 1); 
$result = curl_exec($curl_handle); 
curl_close($curl_handle); 

et au lieu de faire écho au résultat, je fais:

list($headers,$content)=explode("\r\n\r\n",$result,2); 
foreach (explode("\r\n",$headers) as $hdr) { 
    header($hdr); 
} 
echo $content; 

Maintenant, le navigateur reconnaît que les données sont gzip, mais donne option pour enregistrer à la place le fichier gzip d'afficher le contenu. Comme mentionné précédemment, je passe juste l'Accept-Encoding que le navigateur me donne, alors pourquoi le problème?

grâce

JP

PS: (je l'ai vu quelques autres questions sur SO liées à friser gzip, mais ils sont incapables de résoudre mes doutes).

+1

Le navigateur reçoit-il l'en-tête "Content-Encoding"? – stillstanding

+0

N'a pas vérifié. Maintenant que vous mentionnez, le plus probablement pas. Comment puis-je vérifier? Aussi: Mon serveur backend ne devrait-il pas envoyer l'en-tête Content-Encoding? Ou est-ce que mon serveur proxy est en train de le manger? AFAIK, mon serveur backend voit comme si la demande provient du navigateur, pas du proxy. –

+1

Pour vérifier les en-têtes dans Chrome: Outils de développement (CTRL + ALT + I), choisissez "Ressources" (activer le panneau si nécessaire) dans les onglets supérieurs, puis "Documents" (exactement sous "Ressources"), puis probablement le seul élément dans la liste de gauche des documents, puis finalement "En-têtes" dans le volet de droite. – Jon

Répondre

0

Les commentaires, un peu plus de recherche google et d'essais et erreurs m'ont aidé à résoudre le problème. Mon curl a été réglé (sans que je fasse quoi que ce soit) pour dégonfler automatiquement la réponse envoyée par le serveur backend. Ainsi, les en-têtes reçus par le navigateur indiquaient "gzip", mais les données reçues ne l'étaient pas.

Arrêtée boucle de dégonfler la réponse:

curl_setopt($curl_handle, CURLOPT_ENCODING, "identity"); 

et maintenant je peux me faire l'écho le résultat tel qu'il est et fonctionne très bien.