Cloudflare Tunnel で ads.txt に対応する備忘録です.

ads.txt とは?
ads.txt は,広告費をもらう人と広告を貼る Web サイトの管理者が一致していることを確認するために使われるテキストファイルです.Google アドセンス等を利用するのに対応しないといけないことの一つで,例えば本サイトの場合は,ドメインが www.labohyt.net なので,ドメインルート labohyt.net にファイルを設置しないといけません.つまり https://labohyt.net/ads.txt でアクセスできないといけません.
しかし Cloudflare Tunnel を使って Web サイトを公開している場合,この「ドメインルート((正確には APEX ドメインと呼ぶべきですが,分かり難いのでここではドメインルートと呼ぶことにします)」に ads.txt を設置するってのがかなり悩ましい問題で四苦八苦しましたので,備忘録として以下対応方法を記しておきたいと思います.

ads.txt の設置場所と CNAME レコードの制限
本 blog の場合,ads.txt を実際に設置しているのは,ドメインルートではなく,サブドメインの www.labohyt.net です.これは Cloudflared Tunnel を利用して Web サイトを公開すると,Cloudflare の DNS に CNAME でドメイン名が設定されるからです.
DNS の CNAME には,CNAME レコードで指定したレコード名と同じレコード名で別タイプのレコードを指定できない(RFC 1912)という制限があります.例えば CNAME レコードで hatena.labohyt.net を設定したら,A レコードとして同じ hatena.labohyt.net を指定はできません.
しかし,ドメインルートはどうしてもこの制限に引っかかってしまいます.実際に Cloudflare DNS でも,MX レコードや TXT レコードでドメインルートが指定されます.だから,Cloudflare Tunnel を利用するために設定される CNAME にはサブドメインを指定せざるを得ないということになる訳です.

ドメインルートをサブドメインに転送
したがって,次に解決すべき問題は,https://labohyt.net/ads.txt を https://www.labohyt.net/ads.txt にどうやって転送するのかになるのですが,この解決のために一般に使われるのが labohyt.net を www.labohyt.net の CNAME として設定することですから,問題は堂々巡りで解決できない……なんてことはありません.Cloudflare 公式の次の機能が使えるらしい……のですが,なぜか私の場合は使えませんでした.

CNAME flattening を使う
CNAME を APEX ドメイン(ドメインルート)に対して使えるようにしたものが CNAME flattening です.Cloudflare による公式の解説は,

にあります.また,

にこの CNAME flattening の有効化の方法の解説もあるのですが,少なくとも私の見る限り,指定された場所に,CNAME flattening for all CNAME records のスイッチが見つかりません.
私の場合は Cloudflare を Free プランで利用させていただいているので,この機能使えないからスイッチがないのかもしれないんですが,少なくとも上に記したドキュメント内にはその旨の記述何もないので,何で使えないのかは今のところ不明です.
と言うことで,別の方法を検討しないといけなかったのですが,いろいろ悩みながら Cloudflare の設定を彷徨った結果,以下の方法で問題を解決することができました.

Dummy IP とリダイレクトを使う
Coudflare の設定ページを「ドメイン => ドメイン名をクリック => ルール => 概要」の順でたどることで,URL リダイレクトの設定ができます.このページのテンプレートの中に「ルートから WWW にリダイレクト」があるので,それを選択して誘導に沿って設定することで結果的には labohyt.net への接続を www.labohyt.net に転送することができました.
なお,デプロイする過程で,ドメインルートの A レコードの設定を求められましたが,ここに設定する値として仮のものを使う場合は 192.0.2.1 を指定するよう「よく見ると」誘導があります(後で Cloudflare DNS でドメインルートの A レコードを 192.0.2.1 に指定しても良いようです).
このダミーアドレス 192.0.2.1 で検索すると,私がしたのと同じ,
のような記事が見つかるので,これも Cloudflare 的に正しいの解決方法のようです.
以上!


