2005年10月14日

j-phoneの端末でimgタグのsrc属性にアクセスを行うときはAcceptヘッダを明示的に指定しています。

Accept: image/jpeg, image/png

って感じで、端末が表示可能な画像形式を羅列します。
これがApacheのMultiViewsとの相性が悪くなるケースがあるというお話。
1.3系です。

たとえば/img.phpという画像吐き出しスクリプトがあったとして

<img src="/img?img=hoge.jpg">

っていうタグがあったとします。
その場合には406エラーが発生して画像が出てこなくなります。
406というのは、リクエストされたURIはクライアントが要求したAcceptとマッチしてませんよ
みたいな感じのエラーです。

原因がわからずapacheのソースを軽く調べてみました。

この時携帯は

GET /img?img=hoge.jpg HTTP/1.0
Accept: image/jpeg, image/png
以下略

みたいなヘッダを吐きます。
サーバ上に/imgってファイルが無いくてMultiViewsが設定されている時は
mod_negotiationのhandle_multiに処理が引き渡されてdo_negotiationに変移して
406エラーを返しているようです。

結局、/imgから/img.phpというファイルを探し出して.phpのmime typeを調べた結果
端末が要求しているAcceptのmimeとサーバで指定されている.phpのmimeが一致しないので
406エラーを返すという挙動っぽいです。

.phpのmime関連付けを image/jpegにしたところ406エラーは出ませんでした(代わりにphpのソースコードがダウンロードされるけど)
.phpのmime関連をなくしたら404が帰ってきました。

Apacheのマニュアルによると

MultiViews 探索は、Multiviews オプションにより有効になります。サーバが /some/dir/foo へのリクエストを受け取り、/some/dir/foo が存在しない場合、サーバはディレクトリを読んで、 foo.* にあてはまる全てのファイルを探し、 事実上それらのファイルをマップするタイプマップを作ります。 そのとき、メディアタイプとコンテントエンコーディングは、 そのファイル名を直接指定したときと同じものが割り当てられます。 それからクライアントの要求に一番合うものを選び、 そのドキュメントを返します。

とありますが、正確にはmime定義されている拡張子しか保管してくれないってこと?

いや、ソース読めば判ることですが、そこまでは【許してください。】

Posted by Yappo at 2005年10月14日 15:50 | TrackBack | tech
Comments

AddType image/jpeg .php
AddHandler php-script .php

これではうまくいきませんか。 .htaccess などで局所的に設定した方が良さそうですが。

Posted by: at 2005年10月15日 15:37
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。