トラブルシュート

fetchで相対パスのファイルが404になるときの原因と対処

ローカルでは取れていたデータが、公開した途端にfetchで404になる。多くは相対パスの基準が、公開後のディレクトリ構成とずれていることが原因です。この記事では、fetchのパスがどこを基準に解釈されるかを押さえ、ずれを切り分けて直す手順をまとめます。

fetchの相対パスは何を基準にするのか

fetchに渡す相対パスは、現在表示しているページのURLを基準に解釈されます。リンクタグやimg srcと違ってJSファイルの場所ではなく、ブラウザのアドレス欄に出ているページの位置が基準になる点が混乱のもとです。

たとえば同じ data.json を取るコードでも、トップで開いたときとサブページで開いたときでは、ページのURLが違うため指す先が変わります。JSをどこに置いたかではなく、どのURLのページから呼ばれたかで結果が変わると理解すると、ずれの理由が見えてきます。

公開後に404になりやすいパターン

ローカルでindex.htmlを直接開いていたときと、公開後にサブフォルダ階層が一段増えたときとでは、ページのURLが変わり、相対パスの基準もずれます。data.json とだけ書いていると、想定と違うフォルダを探しに行って404になります。

末尾スラッシュの有無も影響します。/dir で開いたときと /dir/ で開いたときでは、相対パスの基準ディレクトリがずれることがあり、同じコードでも取れたり404になったりします。

ルート基準の絶対パス(/data.json)に変えれば基準は固定できますが、公開先のルート構成が想定と違うと今度はそこで外れます。一時共有のZIPでは、配置を保ったまま公開できる前提で相対パスを組むのが扱いやすいです。

症状別チェック表

fetchで相対パスのファイルが404になるときの原因と対処は、症状を分けずに直そうとすると原因探しが長引きます。まず「自分だけで起きるのか」「全員で起きるのか」「特定ブラウザだけか」「差し替え後だけか」を切り分けます。

確認順序を固定すると、相対パス、ファイル名、キャッシュ、認証、外部読み込みのどこで止まっているかが見えます。修正後はローカル確認だけで終わらせず、実際の共有URLで再表示して、相手と同じ条件で直ったことを確認します。

  • 自分だけ表示されない: キャッシュ、ログイン状態、ブラウザ拡張、端末幅を確認する
  • 全員で表示されない: ファイル構成、相対パス、大文字小文字、アップロード漏れを見る
  • 一部だけ崩れる: CSS/画像/JSごとに読み込みエラーを分ける
  • 差し替え後だけ古い: URL、キャッシュ、更新対象ファイルの取り違えを確認する

404の原因を切り分ける手順

推測ではなく、実際にどのURLを取りに行ったかを見れば原因はすぐ分かります。次の順で確認します。

  1. F12のNetworkタブを開いてページを再読み込みする
  2. fetchしたファイルの行を探し、ステータスが404になっているか確認する
  3. その行のRequest URLを見て、実際に取りに行った完全なパスを確かめる
  4. ファイルツリー上の本当の置き場所と、取りに行ったパスを突き合わせる
  5. ずれていれば、現在のページURLを基準に正しい相対パスへ書き直す

大文字小文字とフォルダ階層の確認

ローカルでは大文字小文字を区別しないことが多く、Data.json を data.json と書いても開けてしまいます。公開環境では区別される場合があり、その差だけで404になります。Request URLとファイル名を一文字ずつ照合してください。

ZIP化したときに親フォルダが一段余計に増え、想定していた階層と実際の配置がずれることもよくあります。Networkで見えるパスと実際のフォルダ構成を見比べると、どこで一段ずれているかが分かります。

配置を保ったまま公開して確認する

fetchの404は公開後の配置に依存するため、ローカルのプレビューだけでは再現しきれません。本番に近い配置で公開し、Networkタブで実際のリクエストURLを見ながら直すのが確実です。

ギガサイト便はJSやJSONを含むZIPをそのままドロップでき、相対位置を保ったまま 〇〇.giga-site.com で公開されます。Networkで取りに行ったURLを確認しながらパスを直し、同じURLのままZIPを差し替えて再検証できます。404が200に変われば解決です。関係者だけに確認してもらいたいときは認証を併用すると安心です。

よくある質問

imgやlinkは取れるのにfetchだけ404になります

fetchの相対パスはJSの位置ではなく、表示中のページのURLを基準に解釈されるためです。imgやlinkとはずれの起き方が異なるので、Networkで実際のRequest URLを確認してください。

末尾のスラッシュで結果が変わるのはなぜですか

/dir と /dir/ では相対パスの基準ディレクトリがずれるためです。同じコードでも開き方で取れたり404になったりするので、現在のページURLを意識してパスを組んでください。

絶対パスにすれば解決しますか

ルート基準の絶対パスにすると基準は固定できますが、公開先のルート構成が想定と違うと外れます。一時共有のZIPでは、配置を保って公開できる前提で相対パスを組む方が扱いやすいです。

パスは合っているはずなのに404が消えません

大文字小文字の違いや、ZIP化で親フォルダが一段増えたことが疑われます。NetworkのRequest URLと実際のファイル名・階層を一文字ずつ照合して、ずれを特定してください。

原因が分からないときはどこから確認すべきですか?

まず自分だけの問題か全員の問題かを分けます。次にシークレットウィンドウ、別ブラウザ、スマホで確認し、ファイル構成・相対パス・キャッシュ・認証設定を順に見ます。

関連記事

トラブルシュート

公開後にJavaScriptが動かないときの原因と直し方

ローカルでは動いていたボタンやアニメーションが公開後に反応しなくなった方向け。JavaScriptが止まる主な原因をファイルパスや読み込み順の観点で切り分け、自分で直せるかどうかを判断できます。

5分で読める
トラブルシュート

公開後に動画が再生されないときの対処

デモページや資料に埋め込んだ動画が公開後に再生されなくなった方向け。動画ファイルの添付漏れ・パスのズレ・ブラウザの自動再生制限を症状ごとに切り分け、自分でできる確認と対処を把握できます。

4分で読める
トラブルシュート

iframeが表示されないときの原因と対処

地図や外部コンテンツをiframeで埋め込んだのに公開後に枠が空白になった方向け。表示許可・HTTPSとHTTPの混在・相対パスのズレを症状ごとに切り分け、適切な対処を選べるようになります。

4分で読める
トラブルシュート

外部JSONの読み込みでパースエラーになるときの確認点

fetchはリクエスト成功なのにJSON.parseで落ちる、という謎のエラーに当たった方向け。Content-Typeの不一致・BOMの混入・HTMLが返ってくる状況など、パースが失敗しやすい原因をパターン別に挙げて確認手順を示します。

5分で読める
トラブルシュート

404ページを自分で用意したいときの考え方

存在しないURLへのアクセス時に表示される 404 ページを自分でデザインしたい方へ。静的 HTML サイトと本番運用では設定方法が異なります。まず 404 の仕組みを正しく把握してから実装する手順を解説します。

5分で読める
「トラブルシュート」の記事をもっと見る →