2010-11-29 13 views
0

自分のサーバーからデータを取り出してクライアントに表示する内部プロキシがあります。私は、プロキシ側のコードを最小限に抑えたいと思っていました。コンテンツサーバーから取得したデータをそのままクライアントに送信することは、すべてのメディアタイプで機能すると考えていました。 HTML/TEXTコードでうまくいきます。しかし、イメージではありません。なぜ私は理解できません。ここでPHPカールが画像を正しく処理しない

は、プロキシ側のコードです:

$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; 

はなぜ上記の画像を正しく表示されませんか? (プロキシをダミーブリッジのようにすることはできません - サーバーから送信された結果を解釈せず、単にそれを渡しても、すべてのコンテンツ/メディアタイプに対して有効にします)。誰かが最もクリーンなソリューションを提案できますか?


注:

1)コンテンツサーバはPHPスクリプトを介してすべてのファイルを処理し、正しく header('Content-Type: image/jpeg');

を使用してヘッダーを渡している私は、サーバーから直接アクセスした場合にそれが正常に動作します。しかし、プロキシから、それは動作しません(ブラウザはバイナリデータを表示します)。

2) 私はCURLOPT_HEADERも非常によく理解していません。

私は

curl_setopt($curl_handle, CURLOPT_HEADER, 1);

を使用する場合は、ブラウザが(テキストだけでなく画像のため)gzipで圧縮されたデータをダウンロードしようとします。

私は

curl_setopt($curl_handle, CURLOPT_HEADER, 0);

を使用する場合は、ブラウザが正しくテキスト/画像を表示しますが、ではない画像データ。 Iプロキシ(ダイレクトリンク)を介して、ブラウザで画像にアクセスするとき


これらは、Googleのクロムで示すレスポンスヘッダです。

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 

レスポンスヘッダは、私が直接コンテンツサーバ上の画像にアクセスしたとき:

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 

私はこれがプロキシ経由でGZIPをされているコンテンツ型に起因している感覚を持っています。誰かが私にこれを理解させる助けてもらえますか?デフォルトでは画像はGZIPPされていませんか? (私は貯蓄が少ないかもしれないと同意する)。そうでなければ、CURL(プロキシ)のデータをGzipしますか? CURLOPT_ENCODINGしないでください。どうすれば修正できますか?

+0

キャッシングの問題の可能性があります。 –

+0

スペンサーのコメントが続きました。 CURLOPT_HEADER = 1の場合、ヘッダーを正しく解析せず、CURLOPT_HEADER = 0を使用して、クライアントに正しいヘッダーを返すことを試みていませんでした。 –

答えて

1

レンダリングとは対照的に、あなたはイメージのためのデータを印刷しているので、あなたが適切なヘッダを送信する必要があり、カールを経由して文字列として画像を取得していますブラウザに正しいコンテンツタイプを伝えるためにheaderを使用してください。それ以外の場合は、それが単なる平文であるとみなされます。

+0

私のサーバはheader( 'Content-Type:image/jpeg')を使ってヘッダを渡しています。 (イメージはサーバー上でPHP経由で提供されます)。サーバーから直接アクセスすると正常に動作します。しかし、上記のプロキシを通して、動作しません。また、質問に私の追加メモを参照してください。 –

+0

これで設定はどうですか?あなたのHTML出力に ''のようなものがあると仮定していますか? –

+0

ブラウザで直接someimage_proxy.phpにアクセスしています。 –

0

さて、あなたは$結果をエコーするとき<img src="..." />

+0

http // myserver.com/someimage.jpgにブラウザで直接アクセスすると、私のサーバはバイナリデータをブラウザに返すでしょう()。 (実際には、に遭遇すると、ブラウザはファイルを要求します)。 –

関連する問題