bun dev 実行中に /blog/ が 404 になるのに、/en/blog/ は表示される現象に遭遇した。
最終的に、ルーティング設定ではなくディレクトリ名衝突が原因だった。
症状
http://localhost:4321/blog/は 404http://localhost:4321/en/blog/は表示される- 本番ビルド (
bun run build) では/blog/index.htmlが生成される
最初に疑ったもの
最初はリンク生成を疑った。
HeaderNavのhref: "/blog"が壊れていないかgetLocalePath()の挙動が日本語だけおかしくないかprefixDefaultLocale: falseまわりで/blogが消えていないか
結論として、どれも問題なかった。
検証プロセス
以下の順に事実を積み上げた。
- 静的出力の確認
bun run buildのログに/blog/index.htmlが出るdist/blog/index.htmlが実際に存在する
- リンクの実出力確認
dist/index.htmlのナビリンクが"/blog/"になっているdist/en/index.htmlは"/en/blog/"になっている
- i18n 仕様の確認
prefixDefaultLocale: falseのため日本語は/blog/が正/ja/blog/が 404 なのは仕様通り
ここまでで「ルート定義とリンクは正しい」と確定した。
根本原因
プロジェクト直下に、記事ソース用ディレクトリとして blog/ を置いていた。
同時にページルートとして src/pages/blog/index.astro を使っていた。
つまり、実ディレクトリ blog/ と URL セグメント /blog が同名で衝突していた。
bun dev ではこの衝突が 404 の原因になった。
修正
- 記事ソース配置を
blog/からcontent/blog/に移動 src/content.config.tsの loader base を./content/blogに変更
これで bun dev でも /blog/ が正常表示になった。
再現時の確認順(そのまま使える)
同じ症状が出たら、以下の順で確認すると早い。
bun run buildで/blog/index.htmlが生成されるかを見る- 生成された
dist/index.htmlのナビリンクが/blog/かを確認する prefixDefaultLocaleの設定を確認し、/ja/blog/の期待値を整理する- URL セグメントと同名の実ディレクトリがプロジェクト直下にないか確認する
学び
- Astro の URL セグメントと、プロジェクト直下の実ディレクトリ名はなるべく重ねない
- 「ビルドでは通るが dev で落ちる」場合は、まず配信経路の優先順位差を疑う
- 404 調査は「リンクの値」「ルート生成」「実ファイル」の 3 点を分離して確認すると早い
hsb.horse