2008年8月1日(金曜日)
厚切りベーコン
- BEST SOFTWARE WRITING (www.amazon.co.jp)
海外の方が Ruby を超オススメする厚切りベーコン! 厚切りベーコン!
……「厚切りベーコン」が頭にこびりついて、他に何が書いてあったか思い出せません。頭の中で「Ruby といえば厚切りベーコン」という嫌な結びつきが……。
- 「厚切りベーコン」にコメントを書く
IE7でコンテント・ネゴシエーションが残念なことになる件
Accept-Language によるコンテント・ネゴシエーションが IE7 でうまく動作しないらしいというお話があり、いろいろ調査。
問題を簡潔にまとめると、「IE7で複数の言語を設定している場合に、その設定の順位が無視されているように見える」という感じ。たとえば、コンテンツ側で日本語と英語を用意しているとき、以下のような動作になります。
- 言語設定何も無し……英語コンテンツが返ってくる
- 英語のみ設定……英語コンテンツが返ってくる
- 日本語のみ設定……日本語コンテンツが返ってくる
- 英語、日本語の順で2言語を設定……英語コンテンツが返ってくる
- 日本語、英語の順で2言語を設定……英語コンテンツが返ってくる (順番が無視されている!)
日本語、英語の順で設定したら日本語を返してほしいのに、何故か英語が返って来るという。
この原因は、「IEBlog : Accept-Language Header for Internet Explorer 7 (blogs.msdn.com)」に書かれている Accept-Language の仕様変更です。IE6 までは言語設定に「日本語 [ja]」という選択肢があったのですが、IE7 ではしれっと「日本語 [ja-JP]」になっており、他の言語についても同様ということですね。
恐ろしいことに「日本語 [ja]」という選択肢はなくなっているので、Accept-Language: ja を送りたい場合は "ja" と手入力しなければなりません。普通の人は手入力しないと思いますから ja-JP の方しか送られないわけです。
で、Accept-Language を受け取る Apache の側ではこんな感じになっています。
- Accept-Language: ja-JP を受け取ったら、ja も候補となる。ただしプライオリティはとても低い (他に優先して返されるものがない場合のみ、ja が返される)
- ja-JP と en-US を受け取った場合、ja と en も候補となる。ただしその場合、ja と en のプライオリティは同一となり、qvalue や Accept-Languageフィールド内での出現順などは全て無視される。
- 結果、ja と en の優先順位が判断できずに LanguagePriority の設定で優先度が高いものを返す
このおかげで、Accept-Language に ja-JP と en-US があり、コンテンツ側で ja と en が用意されているという状況では、qvalueにかかわらず ja と en のプライオリティは全く同一になってしまいます。結果として、言語の順番が無視されているように見えるわけです。
間違いではない気もしますが直感に反する動作ですね。mod_negotiation を修正してほしい感じがしますが……。
関連する話題: Web / Internet Explorer / Apache
- 前(古い): 2008年7月30日(Wednesday)のえび日記
- 次(新しい): 2008年8月4日(Monday)のえび日記