外部http画像を無理やりSSL対応する

  • 投稿 : 2018-03-09
参考にして利用するときは、自己責任でお願いします

サイトをSSL化したときに、外部画像の一部がどうしてもhttpで残ってしまって困ってました。削除するというのも一つの方法なのですが、なんとか残したいと・・。

で、アメブロで試してみると、外部のhttp画像は、画像プロキシーのような感じでうまく埋め込めるようになっているようです。実際に試して、HTMLソースをみれば、<img src="http:// の部分が置き換わっているのを確認できるかと思います。

ということで、同じ路線で回避できないか?ということでやってみました。

参考にしたソース

<?php
header("Content-type:image/png");
echo (file_get_contents("https://" . substr($_SERVER['PATH_INFO'],1)));
たった2行で簡易画像Proxyサーバを作る - Qiita

参考にしたのは上記です。

サンプルソース

UA、IP、リファラも渡せるように少し上記を変更してみました。あとQUERY_STRINGも引き継ぐようにしました。画像ビーコンとかPV計測用に埋め込まれてる場合は、そういうのも継承して引き渡したほうがよいのかなぁ?と思ったので。

<?php
//img-proxy.php
$ua = $_SERVER['HTTP_USER_AGENT'];
$referer = $_SERVER['HTTP_REFERER'];
$addr = $_SERVER["REMOTE_ADDR"] ;

$option = array(
  'http' => array(
    'method' => 'GET',
    'header' => 'User-Agent: '.$ua."\r\n".
    //#参照元URLを設定
    'Referer: '.$referer."\r\n".
    'X-Forwarded-For: '.$addr."\r\n"
  )
);
$context = stream_context_create($option);

$img_url ="http://" .substr($_SERVER['PATH_INFO'],1)."?".$_SERVER['QUERY_STRING'];

header("Content-type:image/png");
echo (file_get_contents($img_url,FALSE,$context));

上記を「img-proxy.php」として保存します。

https://blog.example.com/img-proxy.php/www.google.co.jp/images/srpr/logo11w.png

で、こんな感じで実行すると、画像が表示されるかと思います。

header("Content-type:image/png");

という感じで、png画像決め打ちで書いてあるので、その部分もpng画像以外を使う場合は変更が必要です。

踏み台とかにされかねないので・・

上記のサンプルソースに、いろんな制限を加えておいたほうがよいと思います。たとえば、中継するサイトに制限を加える。上記なら、「www.google.co.jp」が含まれる時だけ動作するとかそういうロジックを加えておいたほうが良いかと思います。

あと、画像を読み込むたびに、PHPが置いているサーバーに負荷がかかる等もあります。

スポンサーリンク