← ishizakahiroshi.com
失敗談 2026-09-29

Cloudflare Pages から Workers へ移したら管理画面だけ 404。静的ファイルの照合では見えない秘密の持ち越し漏れを、配備の手前で止める

照合は全部通った、なのに管理画面だけ 404

manabi-map の一部を Cloudflare Pages から Workers の static assets へ移しました。1 万件を超える静的ファイルを突き合わせて全部一致したのに、管理者がログインすると管理画面から追い出される。Pages Functions が読んでいた秘密を、Worker へ持ち越していなかったのが原因でした。見つけ方と、次から配備の手前で止めるために足した検査の記録です。

Qiita で読む →
記事の要約

この記事のテーマ

1 万件が全部一致しても、管理画面だけ 404

Preview、workers.dev、独自ドメインの 3 か所で、ファイルの中身とヘッダの照合は全部合格しました。それでも管理者判定の API は 404 を返していました。この API は、管理者でないときも、Supabase の URL や鍵が無いときも、同じ 404 を返す作りです。外から見ると「管理者ではない」と「設定が無い」の区別がつきませんでした。

移行元にも、秘密は 1 つも無かった

Worker は移行元の Pages の設定に合わせて作りましたが、その Pages 側にも環境変数が 1 つも無かった。照合が見ているのは配ったファイルだけで、Worker に付く binding は見ていません。引っ越しで荷物は全部届いたのに、裏口の鍵だけ旧居に置いてきた状態でした。

荷物は全部そろったのに、裏口の鍵だけ旧居に置いてきた

秘密を足した後の 1 回目の 404 は、正しい 404

秘密を足した version を Preview で照合してから本番化しても、1 回目はまた 404 でした。Supabase のログで要求元を突き合わせると、1 回目は Google、2 回目は LINE でログインしたアカウントで、管理者として登録してあったのは片方だけでした。

配備の手前に、関所を 2 つ足した

コードが読む env 名をファイルに宣言してテストで照合する関所と、本番化の直前に wrangler versions view --json で binding を読み、宣言と完全一致しなければ止める関所です。あわせて、新しい Worker でも最初の本番化より前に秘密を足せるようにしました。

静的ファイルの照合が見ていた範囲と、足した 2 つの関所

参考リンク