自分のサーバーからデータを取り出してクライアントに表示する内部プロキシがあります。私は、プロキシ側のコードを最小限に抑えたいと思っていました。コンテンツサーバーから取得したデータをそのままクライアントに送信することは、すべてのメディアタイプで機能すると考えていました。 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しないでください。どうすれば修正できますか?
キャッシングの問題の可能性があります。 –
スペンサーのコメントが続きました。 CURLOPT_HEADER = 1の場合、ヘッダーを正しく解析せず、CURLOPT_HEADER = 0を使用して、クライアントに正しいヘッダーを返すことを試みていませんでした。 –