[解決?][Apache vs. IE] コンテントネゴシエーションが上手く機能しない?

Apacheで自宅サーバーを立てているが、「Options MultiViews」を設定しても、IEではLanguagePriorityの1番目の言語でしか表示されずに困っていたが、IE側に問題があることが判明し、ようやく解決できた。

その方法は、、、

IEのメニューから「ツール」「インターネットオプション」->「全般」タブ – デザイン「言語」ボタン->「言語の優先順位」ダイアログの「追加」ボタンの順にクリックして「言語の追加」ダイアログを開き、「ユーザー定義」のテキストフィールドに2回に分けて「jp」と「en」を直接打ち込み「OK」をクリック。

言語の追加ダイアログ

これで、「Accept-Language: ja,en;q=0.5」がWebサーバーに送られるようになる。

本来は、「ja,en-US;q=0.7,en;q=0.3」のように、まず「サブタイプなし」のタグに、必要ならば「サブタイプ付き」を前に加えるような設定が推奨されるのであるが、相変わらずMicrosoftでは「ja-JP,en-US;q=0.5」と常にサブタイプを付けるのが正しいと思い込んでいるようである。

Accept-Language: en
英語なら無難にどこでもあるだろう!
Accept-Language: en-US,en;q=0.5
America is No.1!
Accept-Language: en-GB
大英帝国の香りがしないものはゴミだ!

Microsoftではどれが一番適切だと思っているのだろうか?

それとも、IISは完成品でApacheは不良品に見せ掛けるためか?

事実、言語タグの追加直後は、
言語タグ追加直後のダイアログ
と「ユーザー定義[ja]」だが、ダイアログを開き直すと、
開き直した時のダイアログ
のように「日本語[ja]」となっている事から、常にサブタイプを付ける必要はないことをIE自身も証明している。

Microsoftのコミュニティでは「日本語のページが見たいのに、英語のページが表示されてしまう。」にあるように「サーバ側に原因」とする考えが支配的のようだが、結局「言語の追加」ダイアログに、

上のリストから選択するか、下のテキストフィールドに直接言語タグを入力してください。
例、ja, en.

と表示するか、リストに「日本語[ja]」、「英語[en]」を追加して置けば済む話だと思うが。

ハイパーテキスト転送プロトコル — HTTP/1.1
15.1.4 Accept ヘッダに関連するプライバシーの問題

リクエスト毎に送られる Accept-Language ヘッダの内容を設定するためのオプションを提供するユーザエージェントは、設定のプロセス中にそれがユーザのプライバシーの損失になるという事に気づかせるようなメッセージを含むようにする事が強く推奨される。
http://www.studyinghttp.net/

とあるように、「言語の追加」ダイアログには何らかの「警告メッセージ」を表示すべきだし、「国」を表すサブタイプ付きのものしかリストしていないのは明らかにセキュリティ意識の低さの表れ。

RFC 2616 14.4 Accept-Language を読むと、IEは書かれていることを遣ろうとはしているようだが、実に粗雑。 1999年の文書なのにね。

Apache側から見るとIEのユーザーすべてが設定し直すのは遠い未来になりそうなので、Accept-Languageヘッダをチェックして警告メッセージを表示するスクリプトをどうぞ。

<?php
  $acc_lan = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
  $ja_alert = true;
  $jp_found = false;
  $ja_msg = '';
  foreach( explode(',', $acc_lan) as  $tag ) {
    if(0 == strncasecmp($tag, 'ja', 2)) {
      switch(@$tag[2]) {
      case ';':
      case '':
        $ja_alert = false;
        break;
      case '-':
        $jp_found = true;
        break;
      default:
        $jp_found = true;
      }
    }
  }
  if( $jp_found && $ja_alert ) {
    $ja_msg = '<div class="al_alert">';
    $ja_msg .= htmlspecialchars("言語タグの設定を誤っている可能性があります。");
    $ja_msg .= htmlspecialchars("以下のサイトを参考に設定し直すことをお勧めします。");
    $ja_msg .= '<br /><a href="http://w.00p0.com/?s=eid%3D950462">';
    $ja_msg .= htmlspecialchars("[解決?][Apache vs. IE] コンテントネゴシエーションが上手く機能しない?");
    $ja_msg .= '</a></div>';
    $ja_msg .= '<!-- © 2012 w.00p0.com. -->';
    $ja_msg .= "¥n";
  }
?>
<html>
...
<body>
...
<?php print $ja_msg; ?>
...
</body>
</html>

結論:

Apacheのマニュアルも一発目から日本語になる!

eid=950462

投稿者: りする?猫文

世相を理数る?猫文