【Apache】日本とGooglebotのIPのみ許可する
AWS Route53 はルーティングポリシーによって特定の国からのアクセスのみに制限することが可能。追加料金なし。
しかし場合によっては、Googleのクローラーがアクセスできなくなり、ページのインデックス登録で問題が出たりする。
AWS Route53で対応する場合、複数のルーティングポリシーを組み合わせて使うカスタムポリシーが最適だが、別途料金がかかるため、費用を最小限にするには Apacheで日本(特定の国)とGooglebotのIPアドレスを許可する のが良い。
環境
当方、AmazonLinuxで作業しています。
$ httpd -V
Server version: Apache/2.4
許可する国のIP/CIDRをダウンロード
以下のサイトから日本に割り当てられたIPをダウンロードして使わせていただきます。
アクセス制御用ひな型>Apache 2.4 をクリックしてダウンロード。
https://ipv4.fetus.jp/jp?_lang=ja-JP

内容は保証されておらず、こちらの注意事項を把握した上で使用します。
ダウンロードしたファイルは任意の場所に配置。
ここでは /etc/httpd/conf.d/ip_address/japan_ipv4.conf とした。
GoogleクローラーのIPをダウンロード
以下より GooglebotのIPアドレスを確認できる。
https://developers.google.com/search/docs/crawling-indexing/verifying-googlebot?hl=ja

Apache2.4の設定で使うために、IPアドレスの取得と整形をPythonでまとめて実行する。googlebot_ipv4.conf ができるので、japan_ipv4.confと同じディレクトリに配置。
# -*- coding:utf-8 -*-
"""
# GooglebotのIPアドレスリストを取得し、Apache2.4の設定ファイルで使える形に出力する
https://developers.google.com/search/docs/crawling-indexing/verifying-googlebot?hl=ja
"""
import os
import requests
import json
def main():
resp = requests.get("https://developers.google.com/search/apis/ipranges/googlebot.json")
json_data = json.loads(resp.content.decode())
ipv4_list = []
for data in json_data.get("prefixes", []):
_ipv4 = data.get("ipv4Prefix")
if not _ipv4:
continue
ipv4_list.append(f"Require ip {_ipv4}")
ipv4_list.append("\n")
with open("googlebot_ipv4.conf", "w") as outfile:
outfile.writelines(ipv4_list)
main()
httpd.confの修正
<Directory "/var/www/html"> の中に追記する。<VirtualHost *:443> の中に追記しても可能。今回は全体に適用するためhttpd.confを修正した。
# ... 省略 ...
# Further relax access to the default document root:
<Directory "/var/www/html">
#
# ... 他の設定
#
<RequireAny>
# 一旦すべて拒否
Require all denied
# 日本に割り当てられたIPアドレスを許可
Include conf.d/ip_address/japan_ipv4.conf
# GooglebotのIPアドレスを許可
Include conf.d/ip_address/googlebot_ipv4.conf
</RequireAny>
</Directory>
# ... 省略 ...
Apache設定ファイルのチェックを実施。sudo がいる場合もある。
apachectl configtest
# Syntax OK
他にも許可したいIPアドレスがあれば、同様の方法で許可できる。
Apache 再起動
sudo service httpd restart