logo hsb.horse
← ブログ一覧に戻る

ブログ

Astro + bun dev で /blog が 404 になる原因と解決手順

Astro + bun dev で /blog が 404 になる問題を、リンク確認・ルート生成・配信経路の順で切り分けて、ディレクトリ名衝突が原因であったことを突き止めるまで。

公開日: 更新日:

bun dev 実行中に /blog/ が 404 になるのに、/en/blog/ は表示される現象に遭遇した。 最終的に、ルーティング設定ではなくディレクトリ名衝突が原因だった。

症状

  • http://localhost:4321/blog/ は 404
  • http://localhost:4321/en/blog/ は表示される
  • 本番ビルド (bun run build) では /blog/index.html が生成される

最初に疑ったもの

最初はリンク生成を疑った。

  • HeaderNavhref: "/blog" が壊れていないか
  • getLocalePath() の挙動が日本語だけおかしくないか
  • prefixDefaultLocale: false まわりで /blog が消えていないか

結論として、どれも問題なかった。

検証プロセス

以下の順に事実を積み上げた。

  1. 静的出力の確認
    • bun run build のログに /blog/index.html が出る
    • dist/blog/index.html が実際に存在する
  2. リンクの実出力確認
    • dist/index.html のナビリンクが "/blog/" になっている
    • dist/en/index.html"/en/blog/" になっている
  3. 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/ が正常表示になった。

再現時の確認順(そのまま使える)

同じ症状が出たら、以下の順で確認すると早い。

  1. bun run build/blog/index.html が生成されるかを見る
  2. 生成された dist/index.html のナビリンクが /blog/ かを確認する
  3. prefixDefaultLocale の設定を確認し、/ja/blog/ の期待値を整理する
  4. URL セグメントと同名の実ディレクトリがプロジェクト直下にないか確認する

学び

  • Astro の URL セグメントと、プロジェクト直下の実ディレクトリ名はなるべく重ねない
  • 「ビルドでは通るが dev で落ちる」場合は、まず配信経路の優先順位差を疑う
  • 404 調査は「リンクの値」「ルート生成」「実ファイル」の 3 点を分離して確認すると早い

関連リンク