mod_negotiation - Apache HTTP サーバ バージョン 2.4

Apache HTTP サーバ バージョン 2.4

Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.4 > モジュール

# Apache モジュール mod_negotiation

翻訳済み言語: en | fr | ja

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。

説明: | コンテントネゴシエーション 機能を提供する
ステータス: | Base
モジュール識別子: | negotiation_module
ソースファイル: | mod_negotiation.c

### 概要

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

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

### トピック

- タイプマップ
- MultiViews

### ディレクティブ

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

### 参照

- `Options`
- `mod_mime`
- コンテントネゴシエーション
- 環境変数
- コメント

## タイプマップ

タイプマップは 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 の ファイルの uri. これは、マップファイルからの相対 URL として 解釈されます。同じサーバに存在しなければならず、クライアントが 直接リクエストしたときにアクセスを許可されるものでなければなりません。
`Body:`
  Apache 2.0 で新設されたこの Body ヘッダを使って、 リソースの実際の内容をタイプマップファイルに書くことができます。 このヘッダは本文の内容の区切りとなる文字列で始まる必要があります。 タイプマップファイルの続く行は、区切り文字列が見つかるまで、 リソースの本文になります。

  ### Example:

  `Body:----xyz----
  <html>
  <body>
  <p>Content of the page.</p>
  </body>
  </html>
  ----xyz----`

## MultiViews

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

ファイルを選択する際に、関連するコンテントネゴシエーションの メタ情報を持たないファイルについて、判定を行うかどうかを `MultiViewsMatch` ディレクティブで設定します。

## CacheNegotiatedDocs ディレクティブ

説明: | コンテントネゴシエーションされたドキュメントをプロキシサーバが キャッシュできるようにする
構文: | `CacheNegotiatedDocs On|Off`
デフォルト: | `CacheNegotiatedDocs Off`
コンテキスト: | サーバ設定ファイル, バーチャルホスト
ステータス: | Base
モジュール: | mod_negotiation
互換性: | バージョン 2.0で構文が変わりました

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

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

2.0 より前のバージョンでは、 `CacheNegotiatedDocs` は引数を取らず、 ディレクティブが存在することで on の動作をしていました。

## ForceLanguagePriority ディレクティブ

説明: | 要求に合う単独のドキュメントが見つからなかったときに行なうことを指定
構文: | `ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]`
デフォルト: | `ForceLanguagePriority Prefer`
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
上書き: | FileInfo
ステータス: | Base
モジュール: | mod_negotiation
互換性: | バージョン 2.0.30 以降で使用可能

`ForceLanguagePriority` ディレクティブは 要求に合うドキュメントを一つだけ返すことができないときに、 `LanguagePriority` ディレクティブを使ってネゴシエーションの結果を返します。

`ForceLanguagePriority Prefer` は、同等の選択肢が いくつかあるときに、HTTP の 300 (MULTIPLE CHOICES) を返す代わりに、 `LanguagePriority` を使って一つだけドキュメントを返すように します。以下のディレクティブが指定されていて、ユーザの `Accept-Language` ヘッダでは `en` と `de` の品質が共に `.500` (同じくらい許容) であるときは、 最初にマッチする variant の `en` が送られます。

`LanguagePriority en fr de
ForceLanguagePriority Prefer`

`ForceLanguagePriority Fallback` では、HTTP 406 (NOT ACCEPTABLE) を送信する代わりに、 `LanguagePriority` が正しい結果を送ります。 以下のディレクティブが指定されていて、ユーザの `Accept-Language` が `es` 言語のみを許可していて、さらにそのような variant がないときには、 以下の `LanguagePriority` のリストの最初の variant が送られます。

`LanguagePriority en fr de
ForceLanguagePriority Fallback`

`Prefer` と `Fallback` の両方のオプションを 同時に指定することができます。 ですから、複数の variant があるときは `LanguagePriority` の最初の variant が送られ、クライアントの許容言語に合う vaiant がないときは 存在するドキュメントで最初のものが送られる、という様にすることができます。

### 参照

- `AddLanguage`

## LanguagePriority ディレクティブ

説明: | クライアントが優先度を示さなかったときの言語の variant の優先度を 指定
構文: | `LanguagePriority MIME-lang [MIME-lang] ...`
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
上書き: | FileInfo
ステータス: | Base
モジュール: | mod_negotiation

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

### Example:

`LanguagePriority en fr de`

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

このディレクティブは他の方法で「最善」 の言語が決定できないときか、`ForceLanguagePriority` ディレクティブが `None` 以外のときにのみ効果があることに注意してください。 一般的には、サーバ側ではなくクライアント側で好みの言語を決定します。

### 参照

- `AddLanguage`

翻訳済み言語: en | fr | ja

## コメント

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.