Edited at

HTTPSのページで外部の非SSLページの画像を表示させても警告にならないようにする

More than 1 year has passed since last update.

ここ最近、SSL化が必須というか、SSLじゃないとダメという風潮ですが

サイトを作るに辺り、外部コンテンツのものを表示する際、

そのサイトが非SSLだとただ単に<img src=>タグで表示させるとブラウザは警告出しますよね・・

解決方法として

・その外部サイトをSSL化する

・画像を自サイトにコピーする

(画像など引用する著作権関連は正しく扱いましょう。この記事の外部サイトの想定は自社の別ドメインのサイトという意味合いです)

がベストなんでしょうけど

ささっとPHPでコード書いちゃえばいいんじゃないかと思う次第

<img src="http://他サイトドメイン/画像.jpg">

となっているので

<img src="/imgsrcproxy.php/http://他サイトドメイン/画像.jpg">

こんな感じに変更し

画像URLのデータを取得して表示する様なPGを書いておけば、


imgsrcproxy.php

<?php

//リクエストされたURLからPHPファイル名+/を外すと、画像URLがわかる
$url=str_replace($_SERVER["SCRIPT_NAME"]."/","",$_SERVER["REQUEST_URI"]);

//画像URL先頭にあるはずのドメインが指定のものかどうか
//踏み台にされるのを防ぐ処理の一環
if(strpos(" ".$url,"http://目的の他サイトドメイン/")==1 || strpos(" ".$url,"https://目的の他サイトドメイン/")==1 )
{
//file_get_contentsで取得する準備
$context = stream_context_create(array(
'http' => array('ignore_errors' => true,
'timeout' => 10, //半分の秒で設定。20秒設定の場合は10
)
));
//file_get_contentsで取得
$r=@file_get_contents($url , false, $context);
if($r!="")
{
//渡ってきたレスポンスヘッダーはそのまま返す
foreach($http_response_header as $key=>$data)
{
header($data);
}
//コンテンツ表示する
echo $r;
}
else
{
echo "error";
}
exit();
}
//不正アクセスなら何もしない
echo "hello";


ブラウザ的には自サイトのコンテンツ表示をしているだけに見えます。

PGの処理的にはリバースプロキシです。

JSでのクロスドメインにも応用できますね。

コード上でも言及していますが、踏み台にされてしまうことがあるので、

必ず目的以外には利用させないように防ぐ手立ては入れておきましょう。