2010-11-29 8 views
0

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?

+0

Il peut s'agir d'un problème de mise en cache. –

+0

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. –

Répondre

1

Vous devez envoyer les en-têtes appropriés en utilisant header pour dire au navigateur le type de contenu correct, sinon il suppose qu'il s'agit simplement de texte en clair.

+0

Mon serveur passe l'en-tête en utilisant l'en-tête ('Content-Type: image/jpeg'); (l'image est servie via PHP sur le serveur). Cela fonctionne très bien si j'accède directement depuis le serveur. Cependant, à travers le proxy ci-dessus, cela ne fonctionne pas. Aussi s'il vous plaît voir ma note ajoutée dans la question. –

+0

Ok, alors, comment est-ce configuré? Je suppose que votre sortie HTML a quelque chose comme '', ou quoi? –

+0

J'accède à someimage_proxy.php directement dans le navigateur. –

0

Eh bien, vous obtenez l'image sous forme de chaîne via Curl, donc quand vous echo $ result, vous imprimez les données de l'image au lieu de rendre <img src="..." />

+0

Si j'accédais directement à http // myserver.com/someimage.jpg dans le navigateur, mon serveur restituerait des données binaires au navigateur (pas de ). (En fait, en rencontrant , le navigateur ferait la demande pour le fichier). –

Questions connexes