Contents
前置き
nginxでGooglebotの検証という記事を書きましたが、すぐ後にGoogleがGooglebotの範囲を公開しました。BingbotについてもVerify Bingbotの下の方で公開していることに気付き(Googlebotと同時期に公開した模様)それに合わせてシンプルに簡易検証ができるようになったので更新します。
Bingbotの範囲について
Bingbotの範囲の方は2022-09-30現在IPv4だけなのでこのデータのまじめ具合をチェックするために全部の逆引きであるPTR RRを検索してみたところ一部NXDOMAINでした。それ以外は各IPv4アドレスをW.X.Y.Zとするとmsnbot-W-X-Y-Z.search.msn.com. というPTR RRで、それらの表引きも正しいA RRを返しました。これらのNXDOMAINをAzureの範囲と突き合わせると、ぎりぎり重なっていない場所でした。なんらかの予約域でしょうか。気になる場合はこれらの基準から外れた範囲を自動的に取り除く手順をかませるのも良いかと思います。
1 2 3 4 5 6 7 8 9 |
0.52.217.139.in-addr.arpa not found: 3(NXDOMAIN) ... 15.52.217.139.in-addr.arpa not found: 3(NXDOMAIN) 0.148.231.52.in-addr.arpa not found: 3(NXDOMAIN) ... 15.148.231.52.in-addr.arpa not found: 3(NXDOMAIN) 80.163.125.20.in-addr.arpa not found: 3(NXDOMAIN) ... 95.163.125.20.in-addr.arpa not found: 3(NXDOMAIN) |
余談ですがさらにこれらのNXDOMAINの範囲の表引きを検索すると、3つの範囲のうち2つの範囲のmsnbot-W-X-Y-Z.search.msn.com.はW.X.Y.ZのA RRを返しました。
1 2 3 4 5 6 7 8 9 |
msnbot-139-217-52-0.search.msn.com not found: 3(NXDOMAIN) ... msnbot-139-217-52-15.search.msn.com not found: 3(NXDOMAIN) msnbot-52-231-148-0.search.msn.com has address 52.231.148.0 ... msnbot-52-231-148-15.search.msn.com has address 52.231.148.15 msnbot-20-125-163-80.search.msn.com has address 20.125.163.80 ... msnbot-20-125-163-95.search.msn.com has address 20.125.163.95 |
GooglebotとBingbotの範囲を整形
定期的(1日1回程度)にGooglebotの範囲とBingbotの範囲をダウンロードしてから以下のような感じでJSONを整形してマップを作成します。恐ろしいことにBingbotの方は e2 80 8b (U+200B) のZERO WIDTH SPACEがリテラル内に入ってるのでlocate対応気にせずtrでサクッと取り除きます。
1 2 3 4 5 |
jq -r '.prefixes[] | ( .ipv4Prefix?, .ipv6Prefix? ) // empty' googlebot.json | sed -n -E -e 's@^(([.0-9]+|[:[:xdigit:]]+)(/[0-9]{1,3})?)$@\1 "Googlebot";@p' >crawler.map jq -r '.prefixes[] | ( .ipv4Prefix?, .ipv6Prefix? ) // empty' bingbot.json | tr -dc '.:/0-9a-fA-F[:space:]' | sed -n -E -e 's@^(([.0-9]+|[:[:xdigit:]]+)(/[0-9]{1,3})?)$@\1 "Bingbot";@p' >>crawler.map |
nginxを設定
あとはGoogleのUser AgentやBingbotのUser Agent(および変更)と組み合わせて以下のようなnginx用の設定を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
map $http_user_agent $crawler_ua { default ""; "~*\b(?<!like\s)(?:APIs-Google|Mediapartners-Google|AdsBot-Google|Googlebot|FeedFetcher-Google|Google-Read-Aloud|DuplexWeb-Google|Google Favicon|googleweblight|Storebot-Google)\b" "Googlebot_UA"; "~*\b(?:bingbot|AdIdxBot)\b" "Bingbot_UA"; } geo $crawler_ip { default ""; include ...../crawler.map; } map $crawler_ua%$crawler_ip $crawler_fake { default 0; "Googlebot_UA%Googlebot" 0; "Bingbot_UA%Bingbot" 0; "~_UA%" 1; } ... server { ... if ($crawler_fake = "1") { return 444; } ... } |
シンプルになりました。少しアレンジしてクローラーの範囲内のUser Agentのチェックをもっと厳密にしたり、クローラーの範囲内でUser Agentがクローラでない場合などをお好みで変えていくのも良いかと思います。