
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
手順
- プロジェクト直下に
publicフォルダを確認 public/ads.txtを作成- AdSense管理画面で提示された内容をそのまま貼り付け
- UTF-8(BOMなし)で保存
- デプロイ
これが最も安全でトラブルが少ない方法です。
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 で確認してください。
シンプルな確認こそが、最も確実な解決策です。