公開 更新 文責 Webaff 編集部
Astroブログでads.txtを設置して確認する手順
- AdSense
- Astro
- Netlify
このブログ(Astro + Netlify)に ads.txt を設置して、本番URLで応答を確認しました。設置自体は public ディレクトリへ置くだけで終わりますが、確認の基準を「ファイルを作ったか」にすると事故ります。本番ドメインのルートから正しい内容がHTTPで返るかまで見た記録を残します。
最初に、この記事を読むうえで前提になる実情を書いておきます。このブログの ads.txt は正しく配信されていますが、AdSense の審査は「有用性の低いコンテンツ」で否認されています。つまり広告は1件も配信されていません。パブリッシャーIDはアカウント作成の時点で発行されるので、否認中でも ads.txt は書けて、正しく200で返ります。ads.txt が正しいことと、審査に通ることは別の問題です。管理画面の ads.txt 警告を消すために作業している人は、ここを切り分けてください。
ads.txtの役割と置き場所
ads.txt は、サイト運営者が「自分の広告枠の販売を許可している事業者」を宣言するテキストファイルです。IAB Tech Lab の取り組みで、偽の広告枠が広告主に提示されるのを防ぐ目的があります。AdSense を使う場合は、Google が案内する販売者情報を記載します。
Googleのヘルプでは ads.txt の利用は必須ではなく強く推奨と案内されています。置いていないこと自体が違反になるわけではありません。
重要なのは、公開URLがサイトのルート直下になることです。ブログのURLが https://example.com なら、次のURLで開ける状態にします。
https://example.com/ads.txt
記事ページやソースディレクトリ内に置くだけでは足りません。次のようなURLになっていないか確認してください。
https://example.com/blog/ads.txt
https://example.com/src/ads.txt
https://example.com/public/ads.txt
独自ドメインをまだ割り当てていない場合は、先に Netlifyに独自ドメインを接続する手順 を済ませた方が確実です。どのドメインのルートに置くかが決まらないと、確認のしようがありません。
記載する行はAdSense管理画面から取る
行を手入力する前に、AdSense管理画面の案内を確認します。Googleのヘルプでは、次の形式で販売者情報を追加する方法が案内されています。
google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0
pub-XXXXXXXXXXXXXXXX は自分のアカウントに割り当てられたパブリッシャーIDです。他人のIDやサンプルのIDをそのまま使ってはいけません。他人のIDを書くと、そのアカウントを自分のサイトの正規販売者として宣言することになります。
確認の手順は次のとおりです。
- AdSenseへログインする
- サイトに関する管理画面を開く
- 対象ドメインのads.txtステータスまたは警告を確認する
- 表示されている行をコピーする
- パブリッシャーIDが自分のアカウントのものか確認する
管理画面の名称や配置は更新されることがあります。画面内に案内が出ている場合は、その内容を優先してください。
複数の広告サービスを使っているサイトでは複数行が必要になります。既存の ads.txt がある場合、AdSense用の1行だけで全体を上書きしないでください。各事業者の公式案内を確認して、必要な行を残します。
AdSense導入時はプライバシーポリシーの開示も必要
ads.txt 自体は Cookie を設置したり利用者の情報を集めたりする仕組みではなく、販売事業者を宣言するだけのテキストファイルです。ただし AdSense の導入には、別途プライバシーポリシーでの開示が必要です。
Googleは、パーソナライズ広告のためにGoogleおよび提携先がCookieを使用すること、利用者がオプトアウトできる手段(Googleの広告設定や aboutads.info など)を、サイトのプライバシーポリシーに明記するよう案内しています。日本国内向けサイトでは、電気通信事業法の外部送信規律の対象になる場合もあります。
ads.txt の設置と並行して、プライバシーポリシー側も反映されているか確認しておくと手戻りを防げます。
Astroのpublicディレクトリへ置く
Astro では public ディレクトリのファイルが加工されず出力先へコピーされます。プロジェクト直下に次の構成で作ります。
astro-project/
├── public/
│ └── ads.txt
├── src/
├── astro.config.mjs
└── package.json
public は src と同じ階層です。src/public/ads.txt ではありません。
ファイル名は半角小文字の ads.txt です。次のような名前になっていないか注意します。
Ads.txtads.TXTads.txt.txtads .txt
Windowsなどで拡張子が非表示になっていると、実際には ads.txt.txt になっていることがあります。エディタやGitの差分でファイル名を確認してください。
作成後にビルドして、出力に含まれているかを見ます。
npm run build
ls -l dist/ads.txt
cat dist/ads.txt
このブログでもこの確認をしてから公開しました。dist/ads.txt が無ければ、デプロイしても配信されません。
Gitで管理しているなら、追跡対象になっているかも見ます。public を .gitignore に入れていると、ローカルでは成功して本番だけ404になります。
git status
git add public/ads.txt
git commit -m "Add ads.txt"
git push
Astro の記事や設定をGitで運用する流れは AstroでMarkdown記事をGit管理する運用 にまとめています。
本番の応答を確認する
デプロイ後、本番URLの応答を見ます。ブラウザだけでなく curl を使うと切り分けが早いです。このブログで実際に確認したのが次の応答です。
$ curl -s -o /dev/null -w 'status=%{http_code} type=%{content_type}\n' https://webaff.net/ads.txt
status=200 type=text/plain; charset=UTF-8
見るべきは3点です。
- ステータスが200である(404やNetlifyのエラーページではない)
Content-Typeがtext/plainである(HTMLが返っていない)- 本文が自分のパブリッシャーIDの行である
Content-Type を見る理由は、SPA向けのリライト設定などで存在しないパスがすべて index.html に転送されていると、200でHTMLが返ることがあるからです。ステータスだけ見ていると気づけません。
本文とヘッダーを分けて見る場合や、リダイレクト先まで追う場合は次を使います。
curl -I https://webaff.net/ads.txt
curl -s https://webaff.net/ads.txt
curl -IL https://webaff.net/ads.txt
www から apex へ転送している構成では、最終的にどのURLが返っているかを -L で確認してください。Netlifyのサブドメインでは取得できるのに独自ドメインだけ404になる場合は、独自ドメインの接続先、Primary domain、DNS、リダイレクト設定を見直します。
なお、このブログの ads.txt は公開ファイルなので、https://webaff.net/ads.txt を開けば実際の1行がそのまま見えます。形式の実物を確認したい場合に使ってください(中身のIDは自分のものに置き換えます)。
404やHTMLが返る場合の切り分け
上から順に見ると原因を絞りやすいです。
| 確認する場所 | 見るもの |
|---|---|
| ローカルのビルド成果物 | dist/ads.txt が存在するか |
| Gitの追跡 | public/ads.txt がコミットされているか |
| Netlifyの公開ディレクトリ | Astroの出力先と一致しているか(通常 dist) |
| Netlifyのデプロイ | 最新コミットのビルドが成功し本番へ公開されたか |
| リダイレクト・リライト | 存在しないパスをHTMLへ転送していないか |
| ファイル名 | 大文字小文字・二重拡張子がないか |
デプロイログに成功と出ていても、古いブランチや別の公開ディレクトリを参照していることがあります。ログではなく公開URLの応答で判断してください。
AdSense管理画面での再確認
本番URLから正しい内容を取得できたら、AdSense管理画面に戻って対象サイトのads.txtステータスを開き、再確認に相当する操作があれば実行します。
ただし、ブラウザで取得できた直後に表示が更新されるとは限りません。Googleのヘルプでは、変更がAdSenseへ反映されるまで数日かかることがあり、広告リクエストが少ないサイトでは最大1か月ほどかかる場合があるとされています。「更新を確認」に相当する操作で早められる場合があります。反映時間の目安は変わることがあるため、最新の案内は管理画面と公式ヘルプで確認してください。
時間を置いても変わらない場合は、次を再点検します。
- AdSenseへ登録したドメインと公開先ドメインが一致しているか
- 本番URLの
/ads.txtで取得できるか - HTTPエラーや認証が発生していないか
- パブリッシャーIDが自分のものか
DIRECTなどの項目を誤って書き換えていないか- 最新デプロイが本番へ反映されているか
そしてもう1つ。そのアカウントが審査に通っているかです。冒頭に書いたとおり、このブログは ads.txt が200で返る状態でも否認されています。
これは Google 側の案内にも表れています。ads.txt のステータスが「Authorized」になったあと、サイトが審査を必要とする場合は別途 Request review を押す流れが案内されています。ads.txt のステータスとサイトの審査は別の段階ということです。ads.txt は広告枠の販売者を宣言するだけで、コンテンツの評価とは無関係です。審査で止まっている場合は、AdSense審査で「有用性の低いコンテンツ」と判定された原因の記録 の方が該当します。
最終チェックリスト
- AdSense管理画面から自分用のads.txt情報を取得した
-
public/ads.txtを作成した(src/public/ではない) - パブリッシャーIDが自分のIDと一致している
-
npm run buildが成功した -
dist/ads.txtにファイルが出力された - Gitへコミットして本番ブランチへ反映した
- Netlifyの本番デプロイが成功した
- 本番URLで
status=200とtype=text/plainを確認した - AdSense管理画面で再確認した
まとめ
Astro で ads.txt を置く作業自体は public/ads.txt を作るだけです。詰まるのはその先で、ローカルのビルド成果物 → Netlifyのデプロイ → 本番URLの応答、という順番で切り分けると原因が特定できます。確認は応答コードだけでなく Content-Type まで見てください。200でHTMLが返っているケースを見落とします。
そして、ads.txt を正しく置いても審査は別に判定されます。このブログがその実例です。
関連記事
Netlifyのデプロイ失敗と本番チェックの誤検知を切り分けた記録
PRのプレビューと本番デプロイがNetlify側の内部エラーで失敗し、GitHub Actionsのliveチェックまで誤って落ちました。ログの見方、APIでは取れない情報、再試行を入れた修正の記録です。
- Netlify
- 運用
- Astro
Netlify BlobsでPVを数える設計とコスト対策
静的サイトの人気記事順を自前のPVで並べるために、Edge FunctionとNetlify Blobsで閲覧数を数えた記録。書き込み上限、毎時の集約、二重起動の防ぎ方、止まったときの気づき方まで。
- Netlify
- Astro
- 運用
日本語Webフォントを自己ホストして転送量を削る手順
Google Fontsから日本語フォントを読むとトップページで52リクエスト553KiBになっていた。サイトで使う文字だけのサブセットを自己ホストして3リクエスト396KiBにした実測と、増えたコストの話。
- Astro
- Netlify
- 表示速度