Digest認証をかけている開発環境にて、FacebookのOGPタグをテストしたいという状況があったのでメモ。
そのままだと、認証が必要なので401エラーになってしまい確認ができません。
そのため、下記の方法のどちらかで「Facebook/Twitterだ!」と判定して、限定的に許可をする設定変更をします。
- HTTPヘッダのUserAgentから判定
- OGPクローラのソースIPから判定
(はじめに)OGPタグの確認に便利なツール
下記の公式デバッグツールから、OGPタグの確認ができます。
Facebookデバッガー
タグの内容を変更した場合、facebookのキャッシュに残っていると変更が適用されないので、キャッシュをupdateしましょう。
HTTPヘッダのUserAgentから判定する方法
Virtual Hostsに追記する
/etc/httpd/conf.d/vhosts.conf
などのVirtual Hostsに、追記をします。
Apacheのバージョンによって文法が違うので、利用中のバージョンをhttpd -v
で確認して、利用中のバージョンにあう方を使ってください。
Apache2.2の場合
<VirtualHost *:80> …省略 <Directory "/var/www/html/public"> ######省略しています###### AuthType Basic AuthName "Secret Area" #allowやrequireを許可しているか確認してください。 Order deny,allow Deny from all #下記の6行を追加してください。 #Facebook許可 SetEnvIf User-Agent facebookexternalhit facebookexternalhit_ok Allow from env=facebookexternalhit_ok #Twitter許可 SetEnvIf User-Agent Twitterbot twitter_ok Allow from env=twitter_ok ######省略しています###### </Directory> ######省略しています###### </VirtualHost>
Apache2.4の場合
<VirtualHost *:80> …省略 <Directory "/var/www/html/public"> ######省略しています###### AuthType Basic AuthName "Secret Area" #下記の6行を追加してください。 #Facebook許可 SetEnvIf User-Agent facebookexternalhit facebookexternalhit_ok Require env facebookexternalhit_ok #Twitter許可 SetEnvIf User-Agent Twitterbot twitter_ok Require env twitter_ok ######省略しています###### </Directory> ######省略しています###### </VirtualHost>
設定を読み込む
$ service httpd configtest
で文法エラーがないか確認して、サーバーを再起動したら完了です。
# service httpd restart
もしくは
# service httpd graceful
※開発中・利用中のサービスの場合、gracefulを使うのが良いと思います。
OGPクローラのソースIPから判定する方法
Apacheを利用している場合の方法です。
ソースIPを確認する
下記のサイトから、ドメインのAS番号を調べます。
Hurricane Electric BGP Toolkit
上記のページにアクセスして、「facebook.com」や「twitter.com」で検索をします。
検索結果の「IP Info」にAS番号が書かれています。
今回は下記のようでした。
- Facebook : AS32934
- Twitter : AS13414
ソースIPを書いたファイルを作成
許可するIPが大量にあるので、ファイルを新しく作成し、その中に許可するIPたちを書いていきます。
/etc/httpd/conf.d/ips_ogp.conf
というファイルを作成して、中身を書き込んでいきます。
Apacheのバージョンによって文法が違うので、利用中のバージョンをhttpd -v
で確認して、利用中のバージョンにあう方を使ってください。
Apache2.2の場合
# cd /etc/httpd/conf.d/ # echo '# Facebook IPs' >> ips_ogp.conf # whois -h whois.radb.net -- '-i origin AS32934' | awk '/^route:/{print "Allow from " $2 ";" }' >> ips_ogp.conf # echo '# Twitter IPs' >> ogp_allow_ips.conf # whois -h whois.radb.net -- '-i origin AS13414' | awk '/^route:/{print "Allow from " $2 ";" }' >> ips_ogp.conf
先程しらべたAS番号をそれぞれ代入してください。
Apache2.4の場合
Apache2.4の場合、AllowではなくRequireを使います。
# cd /etc/httpd/conf.d/ # echo '# Facebook IPs' >> ips_ogp.conf # whois -h whois.radb.net -- '-i origin AS32934' | awk '/^route:/{print "Require ip " $2 ";" }' >> ips_ogp.conf # echo '# Twitter IPs' >> ogp_allow_ips.conf # whois -h whois.radb.net -- '-i origin AS13414' | awk '/^route:/{print "Require ip " $2 ";" }' >> ips_ogp.conf
Virtual Hostsで作成したファイルを読み込む
/etc/httpd/conf.d/vhosts.conf
などのVirtual Hostsで、先ほど作成したconfファイルを読み込みます。
<VirtualHost *:80> …省略 <Directory "/var/www/html/public"> ######省略しています###### AuthType Basic AuthName "Secret Area" #allowやrequireを許可しているか確認してください。 Order deny,allow Deny from all #下記の1行を追加してください。 Include /etc/httpd/conf.d/ips_ogp.conf Require valid-user ######省略しています###### </Directory> ######省略しています###### </VirtualHost>
設定を読み込む
$ service httpd configtest
で文法エラーがないか確認して、サーバーを再起動したら完了です。
# service httpd restart
もしくは
# service httpd graceful
※開発中・利用中のサービスの場合、gracefulを使うのが良いと思います。
あとがき
最初ソースIPの方を使っていたのですが、「UserAgentを見たほうがいいのでは」と先輩にアドバイスをもらったので最終的にUser Agentでやりました。
参考にした下記の記事にはUserAgentだと偽造ができるからセキュリティ的に良くない、と書いてあるけど、短時間しか確認しないのであれば、
- 大量のIPを許可するのはセキュリティ的に良くない
- IP変更に都度都度対応しなきゃいけない
ということもあり、UA判定のほうが良さそうというのも納得。

Webコンテンツマーケティング サイトを成功に導く現場の教科書
- 作者: 株式会社日本SPセンター
- 出版社/メーカー: エムディエヌコーポレーション(MdN)
- 発売日: 2015/12/18
- メディア: Kindle版
- この商品を含むブログを見る