認証が必要なページにAdsenseを貼る場合の注意点


認証が必要なページに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が追加されている。

User-agentが判明
User-agentが判明

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/

ふー。ハマっちまったぜ。。。ま、普通は管理ページに広告貼る人はあまりいないと思うので、わりとレアなケースだったのかもしれない。

関連する記事


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください