画像の読み込み失敗が本番環境だけで起こる|パス問題とキャッシュの対処法

画像の読み込み失敗が本番環境だけで起こる|パス問題とキャッシュの対処法
C
クリオ
Web制作ディレクター / フロントエンジニア

こんにちは!

今日は「画像の読み込み失敗が本番環境だけで起こる原因と対処法」について解説します。

ローカルと本canonical環境でなぜ画像が違う挙動をするのか

これ、めっちゃ多い相談やんか。
「ローカルではちゃんと画像が表示されるのに、本番にアップしたら画像が真っ白になってる…」っていうやつですね。
僕も新人の頃、これで何時間も悩んだことがあります。

実は、ローカル環境と本番環境では、ファイルの配置、サーバーの設定、ネットワーク状況などがぜんぜん違うんです。
ローカルでは動いてても本番では動かない…それは環境の差が原因やんけ、っていうわけなんですよ。
でも安心してください。
原因がわかれば対処は簡単です。

相対パスと絶対パスの落とし穴

画像が読み込めない一番多い原因は「パス指定の間違い」です。
特に相対パスには要注意です。

例えば、こんなファイル構造があるとします:

  • index.html
  • /images/photo.jpg
  • /css/style.css

HTMLで画像を指定する場合、こう書きますよね:

<img src="images/photo.jpg" alt="写真">

これはローカルで動きます。
でも本番サーバーがサブディレクトリ配置になってたら?例えば example.com/project/ みたいな階層があったら、パスが合わなくなるんです。

ほんまに現場あるあるなんやけど、サブディレクトリでの運用を最後に聞かされることもあります。
そういう時は絶対パスか、ちゃんと環境に応じたパス指定が必要になってくるんですよ。

対処方法としては:

  • 本番環境のドメイン+パスを確認する
  • ドキュメントルートからの相対パスを正確に指定する
  • 可能なら <base href=""> タグを使って基準パスを統一する
  • 動的なパス生成が必要な場合は、サーバーサイドで環境変数を使う

キャッシュとHTTPキャッシュヘッダーの影響

これね、すごく見落とされやすいやつなんです。
パスは正しいのに、なぜか古い画像が表示される…そういう時はキャッシュの可能性が高い。

ブラウザキャッシュとサーバーキャッシュの両方があります。
ブラウザは一度読み込んだ画像を記憶しとくんです。
パスが同じなら、再度ダウンロードしないで、保存された画像を使う。
これ自体は通信を減らすていい機能やんか。
でも開発中は邪魔になることもあります。

本番にアップした直後に古い画像が見える場合:

  • ブラウザのキャッシュをクリア(Ctrl+Shift+Delete)
  • シークレットウィンドウで確認する
  • サーバー側で Cache-Control: no-cache を設定する(本番では max-age を設定)
  • 画像ファイルに バージョン番号をつける(photo.jpg?v=1.2.3 など)

僕のおすすめは「バージョンクエリを付ける」方法です。
ファイル名を変えずにブラウザに新しいファイルと認識させられるんです。
本番環境のHTTPレスポンスヘッダーも確認することをお忘れなく。
Cache-ControlETag がどう設定されてるかで、キャッシュの挙動が変わってきますよ。

まとめ

画像が本番環境だけで読み込めないときは、以下のことをチェックするといいですよ:

  • ファイルの実際のパスが本番環境で正しいか
  • 相対パスが環境に合わせて正しく指定されてるか
  • サブディレクトリ配置になってないか
  • ブラウザキャッシュが邪魔してないか
  • サーバーのHTTPキャッシュヘッダー設定を確認したか

最初は戸惑うかもしれませんが、これらを一つずつ確認していけば、ほぼ100%原因が特定できます。
僕も最初はこの問題で何度も泣かされましたけど、今ではサッと判断できるようになりました。
あなたも大丈夫。
この記事を参考に、地道に確認していってくださいね!

Web制作で困ったことがあったら、またこのブログを覗いてくださいね!

― クリオ