# 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 も参照してください。