J'ai un proxy interne qui récupère des données de mon propre serveur et affiche au client. Je voulais que le code du proxy soit minimal, et je pensais que le simple fait d'envoyer les données provenant du serveur de contenu tel qu'il est au client fonctionnerait pour tous les types de médias. Cela fonctionne bien pour le code HTML/TEXT. Cependant, pas pour les images. Je suis incapable de comprendre pourquoi.Curl PHP ne gère pas les images correctement
Voici le code côté proxy:
$curl_url="http//myserver.com/someimage.jpg";
//Open connection
$curl_handle = curl_init();
curl_setopt($curl_handle,CURLOPT_COOKIE,session_name()."=".session_id().";");
//Set the url, number of POST vars, POST data
curl_setopt($curl_handle, CURLOPT_URL, $curl_url);
curl_setopt($curl_handle, CURLOPT_POST, count($_POST));
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $_POST);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl_handle, CURLOPT_HEADER, 0);
/// curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers);
/// Above is actually uncommented but omitting details for brevity. They are just
/// HTTP headers passed by the client
curl_setopt($curl_handle, CURLOPT_ENCODING, "identity");
//Execute post
$result = curl_exec($curl_handle);
//Close connection
curl_close($curl_handle);
echo $result;
Pourquoi ne pas afficher les images ci-dessus correctement? (Est-ce qu'il n'est pas possible de faire du proxy comme un pont factice - qu'il n'interprète pas le résultat envoyé par le serveur mais qu'il le transmette tout en le faisant fonctionner pour tous les types de contenu/média?). Quelqu'un peut-il suggérer la solution la plus propre?
Notes:
1) Le serveur de contenu gère tous les fichiers via un script php, et passe correctement l'en-tête en utilisant header('Content-Type: image/jpeg');
Il fonctionne très bien si j'accéder directement à partir du serveur. Cependant, à partir du proxy, cela ne fonctionne pas (le navigateur affiche les données binaires).
2) Je ne comprends pas très bien CURLOPT_HEADER non plus.
Si je
curl_setopt($curl_handle, CURLOPT_HEADER, 1);
navigateur tente de télécharger des données gzip (pour le texte, ainsi que des images).
Si je
curl_setopt($curl_handle, CURLOPT_HEADER, 0);
navigateur affiche le texte/images correctement, mais pas de données d'image.
Voici les en-têtes de réponse affichés par Google Chrome, lorsque j'accède à l'image dans le navigateur via le proxy (lien direct).
Response Headers
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:2576
Content-Type:text/html
Date:Mon, 29 Nov 2010 18:03:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=15, max=100
Pragma:no-cache
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.2-1ubuntu4.5
Les en-têtes de réponse lorsque j'accéder à l'image directement sur le serveur de contenu:
Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:3669
Content-Type:image/jpeg
Date:Mon, 29 Nov 2010 18:07:25 GMT
ETag:"1802b6-e55-49633c9623e40"
Keep-Alive:timeout=15, max=96
Last-Modified:Mon, 29 Nov 2010 16:44:33 GMT
Server:Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g
Je sens cela est dû au type de contenu étant GZIP via le proxy. Quelqu'un peut-il m'aider s'il vous plaît à comprendre ceci: ne sont pas des images GZIPPed par apache par défaut? (Je suis d'accord que les économies pourraient être moins). Si non, alors CURL (le proxy) gzippe-t-il les données? Ne devrait pas CURLOPT_ENCODING, "identité" l'empêcher? Comment puis-je résoudre?
Il peut s'agir d'un problème de mise en cache. –
Les commentaires continus de Spencer m'ont aidé à résoudre le problème. Avec CURLOPT_HEADER = 1, je n'analysais pas correctement les en-têtes et avec CURLOPT_HEADER = 0, je n'essayais même pas de redonner l'en-tête correct au client. –