【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