# mod_negotiation モジュール

このモジュールは コンテントネゴシエーションを提供します。

ステータス: Base
ソースファイル: mod_negotiation.c
モジュール識別子: negotiation_module

## 概要

コンテントネゴシエーション、より正確にはコンテンツの選択機能は、 複数用意されているドキュメントから、クライアントの能力に一番合った ドキュメントを選択する機能です。この実装は二つあります。

- タイプマップ (`type-map` ハンドラで扱われるファイル)。これは variants を含んでいるファイルを明示的に指定します。
- MultiViews の探索 (MultiViews オプション で使用するようになります)。 サーバが暗黙の内にファイル名のパターンマッチを行ない、 その結果から選択します。

## ディレクティブ

- CacheNegotiatedDocs
- LanguagePriority

DefaultLanguage, AddEncoding, AddLanguage, AddType, Options も参照してください。

## タイプマップ

タイプマップは RFC 822 のメールヘッダと同じ書式です。 ドキュメントの記述が空行で分離されて書かれていて、ハッシュ文字 ('#') で始まる行はコメントとして扱われます。 ドキュメントの説明は複数のヘッダレコードから構成されます。 レコードは、続きの行が空白で始まっていると複数の行にまたがります。 最初の空白が消去されて、前の行とつなげて 1 行として扱われます。 ヘッダレコードはキーワード名の後に値が続くという形式で、 キーワード名は常にコロンで終わります。空白はヘッダ名と値の間、 値のトークンの間に入れることができます。 使用可能なヘッダは以下のとおりです:

Content-Encoding:
  ファイルのエンコーディング。Apache は AddEncoding で定義されたエンコーディングだけを認識します。通常 compress されたファイルのための `x-compress` と gzip されたファイルのための `x-gzip` を含みます。 エンコーディングの比較をするときは、接頭辞 `x-` は無視されます。
Content-Language:
  インターネット標準の言語タグ (RFC 1766) で定義されている言語の種類。例えば、`en` は英語を表します。
Content-Length:
  ファイルの長さ (バイト数)。 このヘッダがない場合、ファイルの実際の長さが使用されます。
Content-Type:
  ドキュメントの MIME メディアタイプ、オプショナルなパラメータ付き。パラメータの構文は `name=value` で、メディアタイプや他のパラメータとはセミコロンで分離されます。 共通のパラメータは以下のとおり:
  level
    メディアタイプのバージョンを示す整数。 `text/html` では 2 がデフォルトで、その他の場合は 0 がデフォルトです。
  qs
    クライアントの能力に関係なく、variant を他と比較したときの相対的な「品質」で、0.0 から 1.0 の範囲の浮動点小数。 例えば、写真を表現しようとしているときは普通は JPEG ファイルの方が ASCII ファイルよりも高い品質になります。 しかし、リソースが ASCII アートで表現されているときは、ASCII ファイルの方が JPEG ファイルよりも高い品質になります。このように、qs はリソース毎に特有の値を取ります。
  例:

  > `Content-Type: image/jpeg; qs=0.8`

URI:
  マップファイルから相対パスで表わした、variant のあるファイルへのパス

## MultiViews

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

## CacheNegotiatedDocs ディレクティブ

構文: CacheNegotiatedDocs
コンテキスト: サーバ設定ファイル
ステータス: Base
モジュール: mod_negotiation
互換性: CacheNegotiatedDocs は Apache 1.1 以降でのみ使用可能。

このディレクティブが設定されていると、コンテントネゴシエーション をした結果のドキュメントのキャッシュを許可します。 これは、プロキシの後ろにいるクライアントが能力に一番合った ドキュメントではなく、 キャッシュをより効果的にするものを得る可能性があるということです。

このディレクティブは HTTP/1.0 ブラウザからのリクエスト のみに適用されます。HTTP/1.1 は、 交渉されたドキュメントのキャッシュに対してずっとよい制御が可能なので、 このディレクティブは HTTP/1.1 のリクエストには影響しません。

## LanguagePriority ディレクティブ

構文: LanguagePriority MIME-lang [MIME-lang] ...
コンテキスト: サーバ設定ファイル、バーチャルホスト、ディレクトリ、.htaccess
上書き: FileInfo
ステータス: Base
モジュール: mod_negotiation

LanguagePriority は、MultiViews リクエストを扱うときに、クライアントが優先順位を提供していない場合の 言語の優先順位を設定します。MIME-lang のリストが優先度の降順に並びます。 例:

> `LanguagePriority en fr de`

`foo.html` がリクエストされ、`foo.html.fr` と `foo.html.de` が両方存在し、 ブラウザが言語の優先順位を提供してない場合は `foo.html.fr` が返されます。

このディレクティブは他の方法で「最善」 の言語が決定できないときのみ効果があることに注意してください。 HTTP/1.1 リクエストが正しく実装されている場合には、 このディレクティブは無効になります。

DefaultLanguage, AddLanguage も参照してください。