ごくまれですが、Railsで作ったサイトでSEOをする時にgoogle botからアクセスを出来る限り早く検出したい場合があります。
新しく公開したページがいち早くGoogleにクロールされて検索結果に表示されるようにしたいからです。
この記事ではrailsでbotからのアクセスを特定する方法を紹介します。
アクセスログを利用する
最も分かり易い方法はアクセスログのユーザーエージェントを見る事です。ユーザーエージェントがGoogle クローラに列挙されているものであればGoogle botからのアクセスです。
ニュース用、PC用、スマホ用、広告確認用、など結構多くのクローラーが動いています。
ただしユーザーエージェントは偽装できます。そのためアクセスログ上のユーザーエージェントでは本当にGoogle botが来たのかを特定できません。
正確に特定するにはアクセスログのIPアドレスからDNSリバースルックアップで googlebot.com または google.com である事を確認します。
詳細はSearch Console ヘルプにあるGooglebot かどうかの確認をご確認下さい。
アクセスログの設定でDNSリバースルックアップをする方法もありますが、外部との通信が発生するためロギングがとても遅くなります。
そのため出来る限り速く検出する方法としては不向きです。
リクエスト時のユーザーエージェントで判定する
おそらくRailsでユーザーエージェントを判定するのに最も利用されているのがbrowserです。
以下のコードのようにbotであればnameを調べるとGoogleからのアクセスであるか判定できます。
if browser.bot?
if browser.name.include?("googlebot")
## ...
end
end
これであればリクエスト時でgooglebotと判定できるのでアクセスログよりも速くGoogleにページがクロールされた事を特定できます。
ですが偽装されたアクセスである可能性は解決していません。
IPも調べる
以下はRailsでリモートIPからDNSリバースルックアップするサンプルコードです。
ここで取得したドメインが googlebot.com または google.com であればgoogleのクローラーである事が担保されます。
@ip = request.remote_ip
@domain = Resolv::DNS.new.getname(@ip).to_s
DNSリバースルックアップは外部との通信が発生するため、リクエストがある毎に実行するととても遅くなります。逆引き結果をキャッシュし非同期処理にするなどの工夫が必要です。
便利なgemのlegitbotを利用する
ここで書かれている事を一通り行ってくれるgemのlegitbotがありました。Googlebotを装ったアタックをブロックする目的でも利用できるようです。
以下はGoogleを装ったアクセスであるかを確認するコードです。
@ip = request.remote_ip
Legitbot::Google.fake?(@ip)
まとめ
便利なgemが揃っているrailsは何をするにしても便利ですね。