.htaccess - mod_negotiation

mod_negotiation

以下は、mod_negotiation モジュールのディレクティブの一覧です。mod_negotiation は、コンテンツネゴシエーション機能を提供します。コンテンツネゴシエーション機能とは、複数用意されているドキュメントから、クライアントに最適なドキュメントを提供する機能です。例えば、異なる言語で書かれた複数のドキュメントがある場合、サーバが自動的にクライアントに最適な言語を選択するなどです。これは、ブラウザがリクエスト毎に、どの言語が最適であるかをサーバに通知していることで実現しています。ブラウザが日本語のドキュメントを要求する場合は、リクエストのヘッダに日本語を指定しています。

# 日本語のドキュメントをリクエストするヘッダ
Accept-Language: ja
日本語のドキュメントをリクエストするヘッダ

上記の例では、日本語のみのリクエストですが、Web サイトによっては複数の言語で書かれたドキュメントが用意されているわけではありません。その場合、複数の言語をリクエストできます。以下の例では、日本語と英語を受け付けるが、日本語を優先してリクエストしている例です。

# 日本語、または英語のドキュメントをリクエストするヘッダ
Accept-Language: ja; q=1.0, en; q=0.5
日本語、または英語のドキュメントをリクエストするヘッダ

Accept-Language ヘッダーでは、q (品質値) 属性を使用して、0.0~ 1.0 までの範囲で優先レベルを設定できます。品質値は、数値が高いほど優先されるため、上記の例では日本語を優先してリクエストしています。もしも、指定する言語のドキュメントが存在しない場合は、最終手段として * 表現があります。ワイルドカードで表現されたリクエストは、コンテンツネゴシエーションが成立しなかった場合の最終的なレスポンスとなります。

# 日本語、または英語、またはその他の言語のドキュメントをリクエストするヘッダ
Accept-Language: ja; q=1.0, en; q=0.5, *; q=0.1
日本語、または英語、またはその他の言語のドキュメントをリクエストするヘッダ

コンテンツネゴシエーションを実装する方法は 2 つあります。1 つは、タイプマップを使用する方法、もう 1 つは、Multiviews を使う方法です。もしも、両方が有効である場合、タイプマップの設定が優先されます。

タイプマップ (*.var ファイル) は、type-map ハンドラに関連付けられたドキュメントです。この機能を使うためには、AddHandler ディレクティブにより、拡張子にハンドラを関連付ける方法が一般的です。

# タイプマップの機能を使用するための設定例
AddHandler type-map .var
タイプマップの機能を使用するための設定例

タイプマップファイルは、コンテンツネゴシエーションを提供するリソースと同じ名前を設定します。例えば、foo.ja.html と foo.en.html に対してタイプマップファイルを作成する場合は、foo.var になります。タイプマップファイルの設定では、以下のように foo.ja.html と foo.en.html にそれぞれのエントリを持つ必要があります。

# タイプマップの機能を使用するための設定例
URI: foo.ja.html
Content-type: text/html
Content-language: ja

URI: foo.en.html
Content-type: text/html
Content-language: en
タイプマップの機能を使用するための設定例 (foo.var)

また、画像のコンテンツネゴシエーションにおいて、クライアントからの要求に優先度の差がなかった場合、qs 属性で "画像の品質" を指定できます。クライアントは、qs の属性値が最も大きい画像を受け取ることができます。qs の属性値は 0.000 ~ 1.000 までの範囲で指定できます。ただし、0.000 を指定した場合は、選択されないことに注意して下さい。また、qs 属性を省略した場合は、1.000 が設定されます。

# タイプマップの機能を使用するための設定例
URI: foo.jpeg
Content-type: image/jpeg; qs=0.8

URI: foo.gif
Content-type: image/gif; qs=0.5

タイプマップの機能を使用するための設定例 (foo.var)

例えば、写真を表現する場合は、gif 画像よりも jpeg 画像の方が高い品質になります。上記の例では、jpeg 画像の方が高い値を設定してありますが、アイコンなどの画像では gif 画像の方が高い品質になります。そのため、qs の属性値は表現されるリソースの性質によって、異なる値になります。タイプマップに設定できるヘッダは以下の通りです。

タイプマップに設定可能なヘッダ一覧
説明
Content-Encoding:ファイルのエンコーディングを指定します。
Content-Language:インターネット標準の言語タグ (RFC 1766) で定義されている言語を指定します。例えば、en は英語を表します。複数の言語が格納される場合は , で区切られます。
Content-Length:ファイルの長さ (バイト数) を指定します。このヘッダがない場合、ファイルの実際の長さが使用されます。
Content-Type:ドキュメントの MIME タイプ(Content-Type) を、パラメータ付きで指定します。パラメータの構文は name=value です。複数のパラメータがある場合は、; で分割します。共通のパラメータは以下の通りです。level
 メディアタイプのバージョンを示す整数を指定します。
 text/html では 2 がデフォルトで、その他の場合は 0 がデフォルトです。qs
 リソースの性質によって異なる相対的な品質値を指定します。
 0.000 ~ 1.000 までの範囲で指定します。
URI:コンテンツネゴシエーションの対象ファイルをマップファイルからの相対パスで指定します。クライアントからリクエストしたときに、アクセスを許可しているディレクトリでなければなりません。
Body:タイプマップファイルに出力される文字列を記述できます。このヘッダに記述した内容は、任意の区切り文字列から、同じ区切り文字列が見つかるまでとなります。Body:----xyz----
<html><body>
<p>Content of the page.</p>
</body></html>
----xyz----

MultiViews は、Options ディレクティブの MultiViews オプションを指定することで有効になります。MultiViews は、クライアントからのリクエストが見つからない場合に、探索を行います。例えば、/some/dir/foo へのリクエストを受け取り、/some/dir/foo が存在 しない場合、foo.* にあてはまるすべてのファイルを探索します。複数のファイルが見つかった場合、クライアントの要求に最適なファイルを選び、そのドキュメントを返します。そのドキュメントのメディアタイプとコンテンツエンコーディングは、そのファイルを直接指定した場合のものと同じものが設定されます。

ファイルを選択する際に、MIME タイプ(Content-Type)、言語、文字セット、エンコーディングについて判定を行うかどうかは MultiViewsMatch ディレクティブで設定できます。

ForceLanguagePriority ディレクティブ

ForceLanguagePriority ディレクティブは、リクエストに最適なドキュメントを 1 つだけ返すことができない場合に LanguagePriority ディレクティブを使ってネゴシエーションの結果を返します。以下は、本ディレクティブの構文となります。

# ForceLanguagePriority ディレクティブの構文
ForceLanguagePriority None|Prefer|Fallback [Prefer]
ForceLanguagePriority ディレクティブの構文
# ForceLanguagePriority ディレクティブの設定例
LanguagePriority en fr de
ForceLanguagePriority Prefer
ForceLanguagePriority ディレクティブの設定例
ForceLanguagePriority ディレクティブの設定値一覧
説明
None本ディレクティブの機能を無効にします。
Preferクライアントからの Accept-Language ヘッダに複数の言語が指定され、かつサーバに指定された複数の言語のコンテンツが存在する場合、HTTP ステータスコード 300 (Multiple Choices) を返す代わりに、LanguagePriority ディレクティブで設定された優先順位の高い言語に一致するコンテンツを返します。言語の優先順位が同じ場合は、最初に一致した言語のコンテンツを返します。
Fallbackクライアントからの Accept-Language ヘッダに指定された言語のコンテンツが存在しない場合、HTTP ステータスコード 406 (Not Acceptable) を返す代わりに、LanguagePriority ディレクティブに設定された優先順位の高い言語と一致するコンテンツを返します。

Prefer と Fallback の両方のオプションを指定した場合は、複数の言語のコンテンツが存在すれば LanguagePriority ディレクティブに設定された最初のコンテンツが返され、指定された言語のコンテンツが存在しなければ最初のコンテンツを返します。

LanguagePriority ディレクティブ

LanguagePriority ディレクティブは、クライアントからの Accept-Language ヘッダに言語の優先順位が指定されていない場合、使用する言語の優先順位を設定します。設定された言語は、優先度の降順で並びます。本ディレクティブは、ForceLanguagePriority ディレクティブに PreferFallback が 1 つ以上指定されている場合に有効となります。None が設定されている場合は、本ディレクティブの設定は無効になります。以下は、本ディレクティブの構文となります。

# LanguagePriority ディレクティブの構文
LanguagePriority MIME-lang [MIME-lang] ...
LanguagePriority ディレクティブの構文
# LanguagePriority ディレクティブの設定例
LanguagePriority en fr de
LanguagePriority ディレクティブの設定例

関連記事

Category:
プログラミング
公開日:
更新日:
Pageviews:
5
Shares:
0
Tag:
.htaccess
Apache
HTTP
Server