新しいサーバーへWebサイト(今回はMHF Wiki)を移行した際、「テキストは表示されるのに、画像だけがずっと非表示(リンク切れ)になる」というトラブルに遭遇しました。

画像のURLを直接ブラウザで叩いてみると、「ファイルが見つかりません(404 Not Found)」というエラーが…。
FTPソフトでサーバーの中身を確認すると、画像ファイル自体は間違いなくアップロードされています。

原因:URLパスのエンコード不一致(UTF-8 vs EUC-JP)
原因を調べていくと、「文字コード(エンコード)」の違いであることが判明しました。
古いWikiシステム等では、日本語を含む画像ファイル名やURLパスが「EUC-JP」で処理されていることがよくあります。
しかし、最近の新しいサーバー(OSやApache)は標準の文字コードが「UTF-8」になっているため、EUC-JPで飛んできたリクエストを正しく解釈できず、「そんな名前のファイルはない」とエラーを返してしまっていたのです。
解決策:VirtualHostで個別に文字コードを指定する
この問題を解決するには、サーバー(Apache)側に「このサイトはEUC-JPで処理してね」と教えてあげる必要があります。
.htaccess に記述して制御する方法もありますが、今回はサーバー全体の php.ini や他のドメインに影響を与えないよう、Apacheのバーチャルホスト(VirtualHost)設定に直接記述して修正することにしました。
Apacheの設定コード(httpd.conf / vhost.conf)
該当するドメインの <VirtualHost> ディレクティブ内に、以下の記述を追加します。
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/html/mhfwiki
ServerName wiki.example.com
# Apache自体のデフォルト文字コードをEUC-JPに設定
AddDefaultCharset euc-jp
# PHPがモジュールとして動いている場合、このドメイン内だけPHPの文字コード設定を上書きする
<IfModule mod_php5.c>
php_flag output_buffering Off
php_value output_handler none
php_value default_charset EUC-JP
php_value mbstring.language Japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input auto
php_value mbstring.http_output EUC-JP
php_value mbstring.internal_encoding EUC-JP
php_value mbstring.substitute_character none
</IfModule>
</VirtualHost>設定のポイント
AddDefaultCharset euc-jp:Apacheがブラウザに返すHTTPヘッダーの文字コードをEUC-JPにします。<IfModule mod_php5.c>内の記述:PHPスクリプト内で処理される文字コード(内部エンコーディングやHTTP出力)を強制的にEUC-JPに合わせます。これにより、PHP側で生成されるURLやファイルパスも正しくEUC-JPとして扱われます。
設定ファイルを保存後、Apacheを再起動(またはリロード)して設定を反映させます。
# CentOS / RHEL系の場合
service httpd reload
# Debian / Ubuntu系の場合
service apache2 reload結果:画像が無事に表示されました!
設定反映後、再度Wikiにアクセスしてみると……

無事に画像が表示されるようになりました!
古いシステムを新しいサーバーへ移行する際は、データベースやファイルの移行だけでなく「文字コードの互換性」にも気をつける必要がありますね。同じような症状でお悩みの方の参考になれば幸いです。