メインコンテンツまでスキップ

[ウェブ収益化 #2] 静的サイトのGoogle AdSense審査自動化: ads.txt 404クロールエラー解決とHeadTags連携

· 約5分
Jihwan Park (jaybee)
AI & Robotics Engineer

Google AdSense 審査およびクローラーパイプライン

📌 重要ポイント (TL;DR)

  • 課題 (Problem): 動的CMS (WordPress) と異なり、GitHub Pagesで運用されるDocusaurusやNext.jsなどの静的サイトジェネレーター (SSG) では、**「要注意 - 収益に重大な影響が出ないよう、ads.txt ファイルの問題を修正してください」**という警告やクローラーのブロックが頻発します。
  • 解決策 (Solution): Docusaurusの headTags 設定でパフォーマンスを損なわずに所有権確認メタタグを注入し、static/ads.txt によりルートディレクトリへ完全配信し、Cloudflare WAFで Googlebot-AdsTxt クローラーを例外許可します。
  • 成果 (Result): クローラーアクセス成功率100%、/ads.txt の404エラーゼロを達成し、Lighthouseパフォーマンススコア95点以上を維持しながらAdSense審査要件を満たしました。

1. 静的サイトにおける AdSense 導入の壁​

開発ブログをカスタムドメイン (https://globaldevlog.com) に移行すると、次のステップは Google AdSense による収益化 です。しかし、静的サイトジェネレーター (SSG) では特有の技術的配慮が必要です:

  1. プラグインや動的バックエンドの不在: プラグインが自動でメタタグや ads.txt を設定してくれるわけではないため、ビルド設定で明示的に定義する必要があります。
  2. クライアント側ハイドレーション vs 静的Head注入: Reactコンポーネント内で遅れてスクリプトを読み込むと、クローラーが判定する前に検証が失敗する恐れがあります。
  3. ads.txt 404 クロールトラップ: クローラーが https://ドメイン/ads.txt に正常にアクセスできないと、審査却下や収益制限が発生します。

2. Step 1: Docusaurus に所有権確認メタタグを挿入​

AdSenseコンソール (サイト > サイトを追加) でドメインを登録する際、所有権の確認が求められます。静的サイトでは headTags オプションによるメタタグ挿入 が最も軽量で確実です。

📐 設定コード (docusaurus.config.ts)​

import type {Config} from '@docusaurus/types';

const config: Config = {
title: 'Global Dev Blog',
url: 'https://globaldevlog.com',
baseUrl: '/',

// Google AdSense 所有権確認メタタグの注入
headTags: [
{
tagName: 'meta',
attributes: {
name: 'google-adsense-account',
content: 'ca-pub-XXXXXXXXXXXXXXXX', // 自身のパブリッシャーID
},
},
],

// ... その他の設定
};

export default config;

3. Step 2: ads.txt のルート配置と404エラー防止​

AdSense審査後によく発生する警告を防ぐため、ファイルを静的アセットディレクトリに配置します:

  1. static/ads.txt を作成:
    google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0
  2. デプロイの実行:
    npm run deploy
  3. curl による確認:
    curl -I https://globaldevlog.com/ads.txt
    HTTP/2 200 および content-type: text/plain が返ることを確認します。

4. Step 3: Cloudflare WAF によるクローラー許可設定​

Cloudflareのプロキシ経由で配信している場合、Bot Fight ModeがGoogleのクローラーを誤検知してブロックすることがあります。

flowchart LR
Bot["Googlebot-AdsTxt クローラー"] --> Edge["Cloudflare 엣지 WAF"]
Edge -->|"User-Agent と ASN を検証"| Rule{"WAF セキュリティルール"}
Rule -->|"Bot Fight Mode (誤検知)"| Drop["403 Forbidden / チャレンジ"]
Rule -->|"バイパスルール"| Origin["GitHub Pages (/ads.txt)"]

Cloudflare WAF カスタムルールの作成​

  • 式:
    (http.user_agent contains "Googlebot-AdsTxt") or (http.user_agent contains "Mediapartners-Google")
  • アクション: スキップ (Skip) — WAFやBot検証をバイパスしてオリジンへ直接リクエストを通します。

5. AdSense 一発合格のための4大チェックリスト​

審査項目必須基準不足時の却下理由
1. 必須ポリシーページ/privacy-policy (プライバシーポリシー)、/about、/contact の完備ナビゲーション違反
2. オリジナルコンテンツ量20〜30本以上の質の高い独自技術記事 (各1,500字以上)価値の低いコンテンツ
3. リンク切れゼロ404エラーや未解決アンカータグが存在しないことサイト機能不全
4. モバイルレスポンシブスマートフォン表示での横スクロールやレイアウト崩れなしモバイルユーザビリティ不足

6. まとめと今後の展開​

これで、headTags によるメタタグ検証、static/ads.txt の完全配信、Cloudflare WAFによるクローラー例外設定が整い、AdSense審査への万全の体制が整いました。

  • 次回の 第3回 では、Google Search Console、Naver Search Advisor、Bing Webmaster Toolsへの6言語マルチサイトマップ登録とSEO自動化について解説します!

📌 Global Dev Blog の関連記事:
• Global Dev Blog - GitHub Pages カスタムドメイン & Cloudflare DNS 設定ガイド
• Global Dev Blog - 静的サイトのセキュリティ強化と npm audit 脆弱性の真実
• 6言語で展開中の Global Dev Blog ホームはこちら