nginxのログでChatGPTクローラーを確認する方法
nginxのアクセスログからGPTBotやOAI-SearchBotなどのAIクローラーを抽出して集計する方法を、設定とコマンドの例つきで解説します。ログ形式の確認、本物かの確かめ方、ステータスの読み方も紹介します。

nginxでAIクローラーを確認するには、日時、ホスト、メソッド、パス、ステータス、ユーザーエージェントを記録するアクセスログの形式を使い、クローラーの名前で抽出します。 そのうえで、名乗っている名前が本物かを、各社が公開している情報で確かめます。Cookie、認証のヘッダー、不要なクエリの値はログに残さないようにしましょう。
まずは標準の形式で十分
nginxには、あらかじめ「combined」というログの形式が用意されています。接続元のアドレス、リクエスト、ステータス、レスポンスのサイズ、参照元、ユーザーエージェントが含まれます。
これだけで、クローラーを名乗るアクセスが、どのパスにアクセスし、どのステータスを受け取ったかが分かります。今のログで、ざっと確認するなら次のコマンドが使えます。
grep -E "OAI-SearchBot|GPTBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User" /var/log/nginx/access.log
クローラーごと、ステータスごとの件数を数えるには、たとえば次のようにします。
for bot in OAI-SearchBot GPTBot ChatGPT-User ClaudeBot Claude-SearchBot PerplexityBot; do
echo "== $bot"
grep "$bot" /var/log/nginx/access.log | awk '{print $9}' | sort | uniq -c
done
combined形式では、9番目の項目がステータスです。ログの形式を変えている場合は、項目の位置も変わるので確認しましょう。
集計しやすいJSON形式で記録する
継続して集計するなら、JSON形式のログのほうが扱いやすくなります。次の例は、Cookie、認証のヘッダー、クエリ文字列を含めずに、必要な項目だけを記録します。
log_format ai_crawlers escape=json
'{"time":"$time_iso8601",'
'"host":"$host",'
'"method":"$request_method",'
'"path":"$uri",'
'"status":$status,'
'"user_agent":"$http_user_agent"}';
access_log /var/log/nginx/ai-crawlers.json ai_crawlers;
設定を反映する前に nginx -t で設定を確認します。本番のserverブロックへのアクセスが記録されているか、ログを読み取るプログラムの権限が合っているかも確認しましょう。
クローラーの名前の部分で照合する
クローラーのバージョンは変わることがあります。ユーザーエージェントの全文ではなく、変わらない名前の部分で照合しましょう。
- OAI-SearchBot、GPTBot、ChatGPT-User
- Claude-SearchBot、ClaudeBot、Claude-User
- PerplexityBot、Perplexity-User
知らないボットは「不明」として残します。いちばん近い名前に無理に当てはめないようにしましょう。それぞれの役割はAIクローラー一覧で解説しています。
本物かどうかは別に確認する
ユーザーエージェントの名前は、本人確認にはなりません。各社が公開しているIPアドレスの範囲と接続元を照らし合わせるか、nginxの手前にある認証済みボットの仕組みを使いましょう。
nginxがCDNやロードバランサーの後ろにある場合は、どのプロキシを信頼し、どの転送元のアドレスを正しいものとするかを決めておきます。インターネットから届いた任意のX-Forwarded-Forの値は信頼しないようにしましょう。
ステータスから読み取る
クローラー、パス、ステータスごとにまとめて確認します。
| ステータス | 意味 |
|---|---|
| 2xx | ページを返した |
| 3xx | 転送した |
| 403 | アクセスを拒否した |
| 404 | パスが存在しない |
| 429 | レート制限で拒否した |
| 5xx | サーバー側でエラーが起きた |
ルールを変える前に、個々のパスを確認します。クローラーがrobots.txtだけを取得している場合と、商品のページで200を受け取っている場合では、状況がまったく違います。403や429が多い場合はCloudflareがChatGPTをブロックしていないか確認する方法の切り分けの手順も参考になります。
ログに残す項目は最小限にする
集計に必要な項目だけを記録します。クエリ文字列、Cookie、リクエストの本文、認証の値は、このログに含める必要はありません。
まとめ
nginxでは、標準のcombined形式でもAIクローラーのアクセスを確認できます。継続して集計するならJSON形式で必要な項目だけを記録し、名前の部分で照合し、接続元で本物かを確かめましょう。
SearchSeal は、クローラーのアクセスは記録しません。登録した質問について、AIの回答と引用元を毎日保存するので、アクセスログとは別に、回答の中での見え方を確認できます。
よくある質問
nginxの標準のログにユーザーエージェントは含まれますか?
標準で用意されているcombined形式には、リクエスト、ステータス、参照元、ユーザーエージェントが含まれます。
クエリ文字列もログに残すべきですか?
初期設定では残さないのがおすすめです。クエリには個人情報や秘密の値が含まれることがあり、クローラーの集計には必要ありません。
ユーザーエージェントだけでGPTBotが本物か確認できますか?
できません。ユーザーエージェントは名乗っている名前にすぎません。各社が公開しているIPアドレスの範囲や、認証済みボットの仕組みで別に確認しましょう。