認証が必要なページにGoogle Adsenseを貼り付けた際に発生した問題に対応した備忘録。わりとハマってしまったので書き留めておく。
その問題とは?
認証エラーの例外が山ほど発生するというもの。
状況としては、次のようなWebアプリだった。
- Rails製Webアプリ
- 例外が発生するとSlackで通知する(slack_notifier + exception_notification)
- 認証管理はdevise + cancancan
- ログインしていないと遷移できないページがあり、未ログインでアクセスすると例外AccessDeniedが発生する
- それらのページ内にAdsenseの広告あり
で、ログイン済の状態でこれらのページにアクセスすると、アプリ自体は予期した通りに動くのだが、Slackに例外が上がってくる。アクセスする度に上がってくるので非常に鬱陶しい。
もちろんこれは私がSlackを使ってなくても、ログには同じ例外が吐き出されているので誰にでも起こりうる話。
Slackで確認
はじめにこの例外を見たとき、一体自分以外に誰がアクセスしてくるんだ?と思いSlackを確認したが、slack_notifierのデフォルト設定ではUser-agentの値は通知してくれない模様。そこで、application_controller.rbを次のように変更した。
📄app/controllers/application_controller.rb
class ApplicationController < ActionController::Base ... before_action :set_notification ... private def set_notification request.env['exception_notifier.exception_data'] = { http_user_agent: request.env['HTTP_USER_AGENT'] } end ... end
そしてページにアクセスして例外を発生させる。Slackを見てみると、次のようにData
が追加されている。
Mediapartners-Googleとな? これを早速ググってみると、どうやらGoogle Adsense用のクローラーであり、ページに最適な広告を選定するため、Adsenseが貼られているページにアクセスしてくるらしい。詳しくはコチラ。
解決方法
こいつがAccessDenied例外を発生させている原因。Googleのヘルプを読むとrobots.txtでクロールを禁止できるが、禁止すると広告は表示されなくなるらしい。今回の要件としては別に広告を表示する必要もなかったので、robots.txtを編集してみる。・・・がそれでもクロールが止まらない!
その後Googleのヘルプをよくよく読むと、User-agent: *
では、Mediapartners-Googleのクロールは止められないらしい。ちゃんとUser-agent: Mediapartners-Google
と指定しなさいと書いてあるじゃないか・・・。
といわけで、次のようにrobots.txtを変更したら、クロールが止まった。
📄public/robots.txt
User-agent: * Disallow: /admin/ User-agent: Mediapartners-Google Disallow: /admin/
ふー。ハマっちまったぜ。。。ま、普通は管理ページに広告貼る人はあまりいないと思うので、わりとレアなケースだったのかもしれない。
関連する記事
- Rails 4.1 + devise + omniauth-google-oauth2 で認証機能を実装する
- 【Rails 5】ヘルパーを使用しているactive_decoratorをrspecでテストする
- エンジニアのためのSidecar百景
- 久しぶりにRailsで開発して感じたこと
- 【実践】RailsでExcelレポート出力(その1)