はてなブックマークのRSSのAPIのAccess-Control-Allow-Origin対策のためproxy作成した。

まずは質問箱の告知から。日曜日は質問箱への回答を行います。今週はまだ質問がきていないのですぐに答えることができます。
https://marshmallow-qa.com/yuki_20211?utm_medium=url_text&utm_source=promotionmarshmallow-qa.com
そっすね最近は質問は減少傾向ですね。聞かれたらなんでもマジレスが僕の質問箱の特徴だ。今までの回答はこんな感じ。
兎に角、聞かれたらなんでも答えますんでお気軽に質問箱までどうぞ?
さて、ちょっと早いけど今日は技術話題でもやろうと思うから早々に本題に入ろう。
ウチのブログのサイドバーの「はてぶがついた記事」についてはajaxではてなブックマークのRSSを取得して表示しているんだけど、CORSのために外部サーバとajaxでの通信ってのは出来ない。

サーバ側でAccess-Control-Allow-Originの設定ができてないとクロスドメインでのAjax利用はできないようになっているんだ。なのでうちのブログではproxyサーバしている人のAPIを利用してそこを経由して取得していた。
だけど、最近はこのサイトはメンテナンスがあまりされないようになったみたいで、うちのブログの「はてぶがついた記事」もタイム・アウトして表示されなくなることが多くなっていた。
なので、自前でで経由させるproxyサーバを用意することにした。とは言ってもレンタルサーバに下記のPHPファイルをおいてそちらを経由するように変更しただけ。
<?
$options = array('http'=>array('header'=>'User-Agent: Entrylist crawler'));
$context = stream_context_create($options);
$html = file_get_contents('http://b.hatena.ne.jp/entrylist?mode=rss&sort=count&url=https://www.ituki-yu2.net/', false, $context);
header('Access-Control-Allow-Origin:https://www.ituki-yu2.net');
header("Content-type: text/xml;charset=utf-8");
echo $html;
基本的にはPHPのfile_get_contentsでRSSを取得してきて、Access-Control-Allow-Originの許可を付けてアウトプットすりゃいいだけなんだけど、はてなブログのAPIにfile_get_contentsでアクセスするときはユーザーエージェントがいるらしい。その条件を追加。

この部分である。
<?
$options = array('http'=>array('header'=>'User-Agent: Entrylist crawler'));
$context = stream_context_create($options);
$html = file_get_contents('http://b.hatena.ne.jp/entrylist?mode=rss&sort=count&url=https://www.ituki-yu2.net/', false, $context);
Access-Control-Allow-Originは「Access-Control-Allow-Origin:*」としてやればすべてのアクセスを許可するが、セキュリティ的な観点から自分のブログ以外のアクセスを許可しない。
気をつけてほしいのは後ろの「/」はいらない。
これだけやれば、あとはcharset=utf8のヘッダーを出力してやればRSSのproxyが完成する。Access-Control-Allow-Originを回避する正攻法ってこういうのしか無い気がする。
はてなブックマークのRSSに追加できるオプションについてはこちらを参照。

自分のサイドバーのブログパーツがどんなふうに動いてるかは下記参照。

今日はこんな感じで終える。おつかれー。


