2008.09.12

ApacheのディスクキャッシュはMime-Typeを見てくれない

以前、開発にかかわったシステムでDBからバイナリデータを取得し、
画像として表示するというプログラムに関わりました。
DBへのアクセス負荷を抑えるために、Apacheのディスクキャッシュ機能を
使用しました。
その時にハマッタことについて説明したいと思います。

まず、DBから取得するバイナリデータは画像がそのまま格納されているので
特に何も処理せず、取得したデータをPHPで画面へ出力します。

>> 以下ソース

$data = 画像データ;
header("Content-type: image/jpeg");
echo $data;

<< ここまでソース

簡単に書くとこのような処理になります。このプログラムがimage_output.phpという名前とすると
画面上のHTMLタグは以下のように記述していました。
<img src="https://hoge.com/image_output.php?imgid=9238291">

処理の流れとしては、
1)ユーザーがブラウザ経由でHTMLにアクセス
2)HTMLのimgタグに埋め込まれているPHP(image_output.php)が呼び出され
  画像IDが9238291の画像をDBから取得して表示する。
  すでにApacheでPHPの処理結果がキャッシュされていれば、
  Apacheのモジュールでキャッシュ側のデータを表示する。
  
といった、2段階の処理が行われます。

これで何も問題ないと私は思い込んでいました。
しかし様々なブラウザでテストすると、IEとFirefoxでは画像が表示されましたが
Operaではバイナリデータが表示されてしまいました。
携帯電話の場合は、DocomoとSoftbankは画像として表示されましたが
AUでは表示されませんでした。
Apacheのキャッシュが保存されるディレクトリは、どんなファイルでもMime-Typeをimage/jpegにするような
設定を試みましたが解決せず、結局自前でキャッシュ機能を作成することとなりました。

Apacheのキャッシュ機能では、ファイルがどんなファイルであってもMime-Typeは無視され、
デフォルトの設定ではプレーンテキストとして扱われてしまうようです。
ブラウザによっては、imgタグであれば画像として表示するような動きをするものもあれば、
Mime-Typeの情報をしっかり見るブラウザがあるようです。

画像を動的に出力するようなシステムを作る際は気をつけてください。

ちなみにAUの端末は拡張子がjpgであれば、
Mime-Typeに関係なく画像として表示する動きをするようです。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
nishimaki