コンテントネゴシエーション

更新日:2003.10.23

 コンテントネゴシエーションとは、言語やファイルタイプなど複数の表現形式のファイルをサーバ上に用意しておき、クライアント(ブラウザ)からのリクエストに応じてサーバが最適なファイルを自動的に判断してレスポンスを返す仕組みのことである。判断するための材料はリクエスト中のヘッダ情報に含まれている。AN HTTPDで使う情報は以下の 3つである。


コンテントネゴシエーションの全般的な説明は下記のページなどを参考にしてもらうといいでしょう。
http://cvs.apache.jp/apache/manual/content-negotiation.htmlhttp://www.hizlab.net/app/apacheadmin.html

  1. 言語

     ホームページを開設している人の中にはマルチリンガルな情報発信をしている人もいるでしょう。その場合、どのようなディレクトリ/ファイル構成にしているかは人様々であろう。例えば日本語と英語の場合には以下のように jp と en 二つのディレクトリに完全に分けているかもしれない。
    	日本語のページ	http://hostname/jp/index.html
    	英 語のページ	http://hostname/en/index.html
    
    また、以下のようにディレクトリは同じで英語のページにはファイル名に -e をつけるようにしているかもしれない。
    	日本語のページ	http://hostname/index.html
    	英 語のページ	http://hostname/index-e.html
    
    もちろんこのような方法でも問題はないが、ここで説明するコンテントネゴシエーションを使うと同じ URLでいずれか望むレスポンスが得られるのである。例えば
    	http://hostname/index
    あるいは
    	http://hostname/index.html
    
    にアクセスすれば日本語で読みたい人には日本語のページを、英語で読みたい人には英語のページを表示することができる。その種は上で述べたヘッダ情報の Accept-Language: にある。

    サーバは Accept-Language: を見てブラウザの言語を判断し、複数用意したファイルの中から最適な言語ファイルを返すという動作をする。IEの場合にはインターネットオプション -> 全般 -> 言語 で設定された情報である。日本語Windowsであれば、デフォルトでは「日本語[ja]」になっている。ここを変更すればサーバは異なる言語のページを返すようになる。

    例えば日本語/英語/フランス語のいずれかで表示したい場合には、サーバには以下のファイルを用意する。(言語が日本語/フランス語以外なら英語表示をデフォルトとしたので英語には .enを付けずに index.htmlとしている。AN HTTPDのオプション/コンテントネゴシエーションでも en をデフォルトにする)
    	日本語ページ用ファイル      index.html.ja
    	フランス語ページ用ファイル  index.html.fr
    	英語ページ用ファイル        index.html
    
    全ファイルに対して *.html.ja/*.html.fr/*.html を用意する。アクセスする URLは http://hostname/index あるいは http://hostname/index.html である。

    コンテントネゴシエーションの実例として全文検索システム Namazu のページ
     http://www.namazu.org/index
    にアクセスすると動作を理解できるであろう。ブラウザの言語を「日本語」と「英語」に変えてアクセスしてみるとよい。上記のApacheのページも別の例である。
     http://cvs.apache.jp/apache/manual/content-negotiation.html

    余談だが、ブラウザの言語の設定は
     日本語[ja]
     英語[en]
    のようにしておくのがよいかもしれない。日本語で読みたいが日本語がなければ英語でという意味になる。上位の方の言語が優先的に使用される。

    言語を英語に設定したままにしておくと、Windows Updateが英語表示になったり、AN HTTPDのエラーメッセージが英語になるなど様々なところで影響が現れる。それだけいろいろなところで Accept-Language: が参照されているということでもあろう。


  2. タイプ

    リクエストの Accept: ヘッダを見て用意したいくつかのファイルタイプを選択的に表示する使い方ができるが、ブラウザ側で Accept: を変更する手段がない?上に、ブラウザの種類によってまちまちなのでタイプを有効に活用できるのかどうか疑問である。

    例えばテキストベースのブラウザ(lynxなど)には text/plain を返すような使い方をするのかどうか? マイナーなブラウザのことを考慮してコンテンツを作成する人がいるとは思えないが。


  3. エンコーディング

    リクエストの Accept-Encoding: ヘッダを見て用意したエンコードファイルを送るかどうかを決定する。コンテントネゴシエーションのエンコーディングを使用する目的は圧縮したファイルを転送することによって転送時間を短縮することにある。ただ、画像ファイルなどもともと圧縮されたファイルではエンコーディングによる効果はほとんどなく、テキストファイルなど効果のあるファイルのみを対象にした方がいいだろう。

    ブラウザの Accept-Encoding: gzip, deflate を変更する手段はない?ので gzipの有無を選択するくらいかもしれないが。

    例えばファイル index.html があるとき、これを gzip圧縮した index.html.gz も用意しておく。
    クライアントから
    	http://hostname/index
    あるいは
    	http://hostname/index.html
    
    のリクエストがあると、サーバは index.htmlではなく index.html.gzを返す。テキストファイルなら数分の1の圧縮効果があり、送信時間が短くなる。

    言語とエンコーディングの両方を実行する場合には、以下のどのファイル名にしてもよい。
     index.gz.html.ja
     index.html.ja.gz
     index.html.gz.ja
「可能な限りgzipで応答する」にチェックをすると「コンテントネゴシエーションを有効にする」のチェックに関わらず gzip で応答するので、「コンテントネゴシエーションを有効にする」のチェックは外すこと。「可能な限りgzipで応答する」にしたときに、GIFやJPEGなどの画像ファイルも対象になるが、サイズの大きな画像ファイルでは処理時間がかかることになるので、gzipで応答するのがいいのか疑問もある。

AN HTTPDを普通に使うときには、コンテントネゴシエーションが何であるかを理解できなくても何も困ることはない。「コンテントネゴシエーションを有効にする」「可能な限りgzipで応答する」ともチェックをオフにし、コンテントネゴシエーションはきれいさっぱり忘れた方が精神衛生上いいかもしれない。:-)


作成:いと,mailto:gfh05223@nifty.com