web-dev-qa-db-ja.com

PHPのヘッダーにAccess-Control-Allow-Originを追加します

WebGLアプリケーションのCORS制限を回避しようとしています。 URLを解決して画像を返すWebサービスがあります。このWebサービスはCORS対応ではないため、返された画像をテクスチャとして使用できません。

私は計画していました:

  1. PHPスクリプトを記述して画像リクエストを処理する
  2. 画像リクエストは、URLパラメータとしてクエリ文字列を介して送信されます

PHPスクリプトは:

  1. クエリ文字列のURLでWebサービスを呼び出す
  2. 画像応答を取得します(Webサービスはcontent-type:image応答を返します)
  3. CORSヘッダーを追加します(Access-Control-Allow-Originを追加)。
  4. ブラウザーに応答を送信します

CURL、HTTPResponse、プレーンvar_dumpなどのさまざまな手法を使用してこれを実装しようとしましたが、それぞれの時点で行き詰まりました。

だから私は2つの質問があります:

  1. アプローチは十分ですか?
  2. アプローチを考慮すると十分です:

CURLで最も進歩しました。私は画像ヘッダーとデータを次のようにして得ることができます:

$ch = curl_init();
$url = $_GET["url"];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:image/jpeg'));

//Execute request 
    $response = curl_exec($ch);

//get the default response headers 
    $headers = curl_getinfo($ch);

//close connection 
    curl_close($ch);

ただし、これによって実際にレスポンスのcontent-typeがimage/jpegに設定されることはありません。ヘッダー+応答をcontent-type text/htmlの新しい応答にダンプし、ブラウザーにヘッダーと画像BLOBデータを表示します。

希望する形式で応答を送信するにはどうすればよいですか?

14
SANDeveloper

最も単純なアプローチが答えであることが判明しました。応答を送信する前にヘッダーを挿入する必要がありました。

    $ch = curl_init();
    $url = $_GET["url"];
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);

//Execute request 
    $response = curl_exec($ch);

//get the default response headers 
    header('Content-Type: image/jpeg');
    header("Access-Control-Allow-Origin: *");

//close connection 
    curl_close($ch);
    flush();
15
SANDeveloper

ヘッダー付きのものをすべて使用する前に、Apache(Apacheを使用している場合)にmod_headersがロードされていることを確認してください。

(以下のヒントはUbuntuで機能しますが、他のディストリビューションについては知りません)

ロードされたモジュールのリストを確認することができます

Apache2ctl -M

使用できるmod_headersを有効にする

a2enmod headers

もちろん、Apacheを変更した後は、再起動する必要があります。

/etc/init.d/Apache2 restart

この後、この行を.htaccessに追加するか、もちろんphpヘッダーを使用してください

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

PHP:

header("Access-Control-Allow-Origin: *");
7
Lukas