English

alt

ads.txt を設置したはずなのに、AdSense 側では「Not found」や「Unauthorized」が消えない。
ブラウザでは表示されるのに、管理画面の警告が残り続ける。

Next.js は便利ですが、「ルート直下で正しく配信する」という一点を外すと簡単に詰まります。

この記事では、Google公式ヘルプおよびIAB Tech Lab仕様を前提に、Next.js(Pages Router / App Router)で ads.txt を確実に配信する方法を、検証手順まで含めて整理します。


ads.txtとは何か

ads.txt(Authorized Digital Sellers)は、広告在庫を販売できる正規事業者を公開する仕組みです。

目的は広告のなりすまし防止と透明性向上です。

Google AdSenseでは必須ではありませんが、設定不備があると警告が表示されます。
また、変更反映には数日かかる場合があります。

重要なのは次の一点です。

ads.txt は必ず「https://あなたのドメイン/ads.txt」で取得できなければならない。


Next.jsでの正解:public/ads.txt に置く

Next.jsでは、public フォルダに配置したファイルはそのままルート直下で配信されます。

/public/ads.txt → https://example.com/ads.txt

手順

  1. プロジェクト直下に public フォルダを確認
  2. public/ads.txt を作成
  3. AdSense管理画面で提示された内容をそのまま貼り付け
  4. UTF-8(BOMなし)で保存
  5. デプロイ

これが最も安全でトラブルが少ない方法です。


Route Handlerで返す方法(必要な場合のみ)

app/ads.txt/route.ts で返すことも可能です。

しかし注意点があります。

  • キャッシュ挙動が複雑
  • middlewareの影響を受けやすい
  • Content-Typeがtext/plainにならない事故が起きやすい

特別な理由がない限り、public配置を推奨します。


よくある落とし穴

1. middlewareが巻き込む

middlewareが有効だと、/ads.txtも通過します。

その結果:

  • ログイン画面へリダイレクト
  • localeリライト
  • www強制変換

などが発生する可能性があります。

対策

middlewareのmatcherから /ads.txt を除外する。


2. 多段リダイレクト

www → non-www
http → https

が連鎖していると取得が不安定になります。

確認方法

curl -I https://あなたのドメイン/ads.txt

確認ポイント:

  • 最終ステータスが200
  • リダイレクトが最小

3. Content-Typeがtext/plainでない

HTMLで返してしまうケースがあります。

確認:

curl -I https://あなたのドメイン/ads.txt

Content-Type: text/plain になっているか確認します。


4. 反映遅延

Googleは反映に数日かかる場合があると明記しています。

200で正しく配信されていれば、慌てる必要はありません。


完全チェックリスト

  • public/ads.txt に設置
  • https://ドメイン/ads.txt で直接表示できる
  • curlで200を確認
  • リダイレクトは最小
  • Content-Typeはtext/plain
  • AdSenseで「更新を確認」
  • 数日待つ

Vercel運用時の注意

VercelはCDNキャッシュを使用します。

通常は静的ファイルで問題ありませんが:

  • 強いキャッシュ設定
  • Edge Function化
  • Route Handler経由

を行うと更新反映が遅れる場合があります。


まとめ

ads.txtは難しい技術ではありません。

しかし、

  • middleware
  • リダイレクト
  • キャッシュ
  • Content-Type

この4点が絡むと突然トラブルになります。

結論はシンプルです。

public/ads.txt に置き、curlで200を確認する。

これが最も再現性のある方法です。

今すぐ curl -I で確認してください。
シンプルな確認こそが、最も確実な解決策です。

関連記事