38N/A<?
xml version="1.0" encoding="UTF-8" ?>
38N/A<!-- English Revision: 675610:1673932 (outdated) --> 38N/A Licensed to the Apache Software Foundation (ASF) under one or more 38N/A contributor license agreements. See the NOTICE file distributed with 38N/A this work for additional information regarding copyright ownership. 38N/A The ASF licenses this file to You under the Apache License, Version 2.0 38N/A (the "License"); you may not use this file except in compliance with 38N/A the License. You may obtain a copy of the License at 38N/A Unless required by applicable law or agreed to in writing, software 38N/A distributed under the License is distributed on an "AS IS" BASIS, 38N/A WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 38N/A See the License for the specific language governing permissions and 38N/A limitations under the License. 38N/A<
title>コンテントネゴシエーション</
title>
38N/A ブラウザにより提供されたメディアタイプ、
38N/A 言語、文字セット、エンコーディングの優先傾向に基づいて、
38N/A また、不完全なネゴシエーション情報を送ってくるブラウザからのリクエストを
38N/A もっと賢く取り扱えるよう、いくつか機能も実装してあります。</
p>
38N/A <
module>mod_negotiation</
module>
38N/A モジュールによって提供されていて、デフォルトで組み込まれています。</
p>
38N/A<
section id="about"><
title>コンテントネゴシエーションについて</
title>
38N/A <
p>リソースは、幾つか異なった表現で利用できる場合があります。
38N/A 例えば、異なる言語や異なるメディアタイプ、
38N/A またはそれらの組み合わせで利用できるかも知れません。
38N/A もっとも適した選択をする方法の一つには、インデックスページを
38N/A ユーザに見せて、ユーザに選んでもらう方法があります。
38N/A しかし、サーバが自動的に選ぶことができる場合が多くあります。
38N/A どの表現を嗜好するかという情報を送ることで動作しています。
38N/A 例えばブラウザは、可能ならフランス語で情報を見たい、
38N/A 不可能ならその代わりに英語でもよいと、
38N/A ブラウザはリクエストのヘッダで自分の優先傾向を知らせます。
38N/A フランス語のみの表現を要求する場合は、ブラウザは次を送ります。</
p>
38N/A<
example>Accept-Language: fr</
example>
このブラウザはフランス語と英語を受け付ける、しかしフランス語を好む、
プレインテキストや他のタイプよりは HTML を好む、
他のメディアタイプよりは GIF や JPEG を好む、しかし最終手段として
他のメディアタイプも受け付ける、と設定されています。</
p>
Accept-Language: fr; q=1.0, en; q=0.5<
br />
<
p>Apache は
HTTP/
1.1 規格で定義されている 'server
driven' コンテントネゴシエーションをサポートしています。
<
code>Accept</
code>, <
code>Accept-Language</
code>,
<
code>Accept-Charset</
code>, <
code>Accept-Encoding</
code>
リクエストヘッダを完全にサポートしています。Apache は
'transparent' コンテントネゴシエーションもサポートしていますが、
これは RFC 2295 と RFC 2296 で定義されている試験的な
これらの RFCで定義されている 'feature negotiation'
<
p><
strong>リソース</
strong>とは URI
で特定される概念上のもののことです (RFC 2396)。 Apache
のような HTTP サーバは、その名前空間の中での
リソースの<
strong>表現</
strong>へのアクセスを提供します。
定義されたメディアタイプ、文字セット、エンコーディング等の
それぞれのリソースはある時点で 0 個、1 個、それ以上の表現と
関連付けられる可能性があります。複数の表現が利用できる場合は、
リソースは<
strong>ネゴシエーション可能である</
strong>とされ、
個々の表現は <
strong>variant</
strong> と呼ばれます。
ネゴシエーション可能なリソースの variant が異なる、
ネゴシエーションの<
strong>次元</
strong>と呼びます。</
p>
<
section id="negotiation"><
title>Apache におけるネゴシエーション</
title>
サーバは variant それぞれについての情報を知っておく必要があります。
これは以下の二つの方法のどちらかで行われます。</
p>
(<
em>すなわち</
em> <
code>*.var</
code> ファイル)
を明示的に挙げているファイルを指定します。</
li>
を使って、サーバが暗黙の内にファイル名にパターン照合を
<
section id="type-map"><
title>type-map ファイルを使う</
title>
<
p>タイプマップは <
code>type-map</
code> ハンドラ
の設定と下位互換である <
glossary ref="mime-type">MIME タイプ</
glossary>
設定ファイル中に置く必要があることに注意してください。
<
example>AddHandler type-map .var</
example>
<
p>をサーバ設定ファイル中に書くことが一番良い方法です。</
p>
<
p>タイプマップファイルは記述するリソースと同じ名前を持っていて、
利用可能な variant それぞれのエントリを持っている必要があります。
そして、このエントリは連続した HTTP のヘッダ行で構成されます。
異なる variant のためのエントリは空行で区切られています。
習慣的には、マップファイルは全体を結合したもののエントリから始まります
(しかしこれは必須ではなく、あったとしても無視されるものです)。
次に例を示します。このファイルはリソース <
code>foo</
code>
を記述しているので、<
code>
foo.var</
code> という名前になります。</
p>
Content-language: en<
br />
Content-type:
text/
html;charset=iso-8859-2<
br />
Content-language: fr, de<
br />
<
p>たとえ MultiViews を使用するようになっていたとしても、
ファイル名の拡張子よりタイプマップの方が優先権を持つということにも
variant の品質が違うときは、この画像のように (JPEG, GIF, ASCII
<
p>qs 値の範囲は 0.000 から 1.000 です。qs 値が
選択されないことに注意してください。'qs' 値のない variant
パラメータはクライアントの能力に関係無く、他の variant と
例えば、写真を表現しようとしているときは JPEG
ファイルよりも高い品質になります。しかし、リソースが元々
ASCII アートで表現されているときは、ASCII ファイルの
方が JPEG ファイルよりも高い品質になります。このように、qs
は 表現されるリソースの性質によって variant
<
section id="multiviews"><
title>Multiviews</
title>
<
p><
code>MultiViews</
code> はディレクトリ毎のオプションで、
<
directive module="core" type="section">Directory</
directive>,
<
directive module="core" type="section">Location</
directive>,
<
directive module="core" type="section">Files</
directive>
セクション中や、(<
directive module="core">AllowOverride</
directive>
が適切な値に 設定されていると) <
code>.htaccess</
code>
ファイルで <
directive module="core">Options</
directive>
<
code>Options All</
code> は
<
p><
code>MultiViews</
code> の効果は以下のようになります:
へのリクエストを受け取り、<
code>/
some/
dir</
code> で
<
code>MultiViews</
code> が有効であって、
サーバはディレクトリを読んで <
code>foo.*</
code>
事実上それらのファイルをマップするタイプマップを作ります。
そのとき、メディアタイプとコンテントエンコーディングは、そのファイル名を
それからクライアントの要求に一番合うものを選びます。</
p>
<
p>サーバがディレクトリの索引を作ろうとしている場合、
は <
directive module="mod_dir">DirectoryIndex</
directive>
<
example>DirectoryIndex index</
example>
両方存在していると、サーバはその中からどちらかを適当に選びます。
が存在していると、 サーバはそれを実行します。</
p>
文字セット、コンテントタイプ、言語、エンコーディングを
指定するための <
code>mod_mime</
code>
で認識できる拡張子を持たないファイルが見つかると、結果は
<
directive module="mod_mime">MultiViewsMatch</
directive>
ディレクティブの設定に依存します。このディレクティブは
ハンドラ、フィルタ、他のファイル拡張子タイプのどれが
MultiViews ネゴシエーションで使用できるかを決定します。</
p>
<
section id="methods"><
title>ネゴシエーション方法</
title>
<
p>Apache はリソースの variant の一覧を、タイプマップファイルか
「最適な」 variant を決定するために二つの方法の
Apache のコンテントネゴシエーションの機能を使うために、
どのようにしてこの調停が行われるか詳細を知る必要はありません。
しかしながら、この文書の残りでは関心のある人のために、
使用されている方法について説明しています。</
p>
<
p>ネゴシエーション方法は二つあります。</
p>
<
li>通常は <
strong>Apache のアルゴリズムを用いた Server
driven negotiation</
strong> が使用されます。Apache
はより良い結果になるように、特定の次元において品質の値を
が品質の値を変える方法は後で詳細に説明されています。</
li>
で定義されている機構を用いてブラウザが特に指定した場合、
<
strong>transparent content negotiation</
strong>
が使用されます。このネゴシエーション方法では、「最適な」
variant の決定をブラウザが完全に制御することができます。
ですから、結果はブラウザが使用しているアルゴリズムに依存します。
Transparent negotiation の処理の過程で、ブラウザは RFC 2296
で 定義されている 'remote variant selection algorithm'
<
section id="dimensions"><
title>ネゴシエーションの次元</
title>
<
columnspec><
column width=".15"/><
column width=".85"/></
columnspec>
<
td>ブラウザは <
code>Accept</
code>
アイテムそれぞれは、関連した品質数値を持つことができます。
variant の説明も品質数値を持つことができます
<
td>ブラウザは <
code>Accept-Language</
code>
variants は 0 か 1 つかそれ以上の言語と
<
td>ブラウザは <
code>Accept-Encoding</
code>
要素それぞれに品質数値を持たせることができます。</
td>
<
td>ブラウザは <
code>Accept-Charset</
code>
variant はメディアタイプのパラメータとして文字セットを
<
section id="algorithm"><
title>Apache ネゴシエーションアルゴリズム</
title>
<
p>ブラウザに返す「最適な」variant を (もしあれば) 選択するように
Apache は次のアルゴリズムを使うことができます。
このアルゴリズムを設定により変更することはできません。
<
li>まずはじめに、ネゴシエーションの次元それぞれについて適切な
<
em>Accept*</
em> ヘッダフィールドを調べ、
もしある次元の <
em>Accept*</
em> ヘッダでその variant
が許容できないことが示されていれば、それを削除します。
variant が一つも残っていなければ、ステップ 4 に行きます。</
li>
テストで選択されなかった variant は削除されていきます。
テスト後 variant が一つだけ残っていれば、それを最適なものとして
複数 variant が残っていれば、次のテストに進みます。
<
li>variant のメディアタイプの品質数値と <
code>Accept</
code>
ヘッダの品質数値との積を計算して、最高値の variant
<
li>言語品質数値が最高の variant を選びます。</
li>
<
li>(もしあれば) <
code>Accept-Language</
code> ヘッダの言語順か、
<
directive module="mod_negotiation">LanguagePriority</
directive>
ディレクティブの言語順で最適な言語の variant を選びます。</
li>
<
li><
code>Accept-Charset</
code> ヘッダ行で与えられている最高の文字セット
メディアパラメータを持つ variant を選びます。
明示的に除外されていない限り、ISO-8859-1
<
code>text/*</
code> メディアタイプであるけれども
特定の文字セットに明示的に関連づけられているわけではない
variant は ISO-8859-1 であると仮定されます。</
li>
<
li>ISO-8859-1 <
em>ではない</
em>文字セットメディアパラメータと
そのような variant がない場合は、代わりに全ての
<
li>最適なエンコーディングの variant を選びます。
もし user-agent が許容するエンコーディングがあれば、
そうではなく、もしエンコードされたものとそうでない
variant が混ざって存在していたらエンコードされていない
variant が全部エンコードされていないという場合は、
<
li>内容の最も短い variant を選びます。</
li>
<
li>残っている variant の最初のものを選びます。
variant がディレクトリから最初に読み込まれる時に
ASCII順でソートしてファイル名が先頭になったか、のどちらかです。</
li>
<
li>アルゴリズムを使って一つの「最適な」variant を選びましたので、
それを応答として返します。ネゴシエーションの次元を指定するために
HTTP レスポンスヘッダ <
code>Vary</
code> が設定されます
ブラウザやキャッシュはこの情報を使うことができます)。
<
li>ここに来たということは、variant が一つも選択されなかった
(ブラウザが許容するものがなかったため) ということです。
406 ステータス ("No Acceptable representation" を意味する)
が、利用可能な variant のリストのついた HTML
相違の次元を示す HTTP <
code>Vary</
code> ヘッダも設定されます。</
li>
<
section id="better"><
title>品質の値を変える</
title>
<
p>上記の Apache ネゴシエーションアルゴリズムの厳格な解釈で
得られるであろう値から、Apache は品質数値を時々変えます。
これは、このアルゴリズムで完全ではない、あるいは正確でない情報を送る
ブラウザ向けによりよい結果を得るために行われます。
かなりポピュラーなブラウザで、もしないと間違った variant
を選択する結果になってしまうような <
code>Accept</
code>
<
section id="wildcards"><
title>メディアタイプとワイルドカード</
title>
<
p><
code>Accept:</
code> リクエストヘッダはメディアタイプの優先傾向を指定します。
といった「ワイルドカード」メディアタイプを含むことができます。
<
example>Accept: image/*, */*</
example>
<
p>を含むリクエストは、"image/" ではじまるタイプ全てが許容できる、
(この場合はじめの "image/*" は冗長になります)
ワイルドカードを送るブラウザもあります。例えば:</
p>
<
p>こうすることの狙いは、明示的にリストしているタイプが優先されるけれども、
異なる表現が利用可能であればそれでも良い、ということです。
*/* ワイルドカードは他の全てのタイプと全く同等なので優先されません。
値を付けてリクエストを送るべきなのです。例えば:</
p>
<
p>明示的なタイプには品質数値が付けられていませんので、
デフォルトの 1.0 (最高値) の優先になります。
ワイルドカード */* は低い優先度 0.01 を与えられているので、
明示的にリストされているタイプに合致する variant がない場合にのみ、
<
p>もし <
code>Accept:</
code> ヘッダが q 値を全く含んで<
em>いなければ</
em>、
Apache は "*/*" があれば 0.01 の q 値を設定します。
また、"type/*" の形のワイルドカードには 0.02 の q 値を設定します
(ですからこれらは "*/*" のマッチよりも優先されます)。
もし <
code>Accept:</
code> ヘッダ中のメディアタイプのどれかが q
値を含んでいれば、これらの特殊な値は適応<
em>されず</
em>、
正しい情報を送るブラウザからのリクエストは期待通りに
<
section id="exceptions"><
title>言語ネゴシエーションの例外処理</
title>
<
p>Apache 2.0 では新たに、言語ネゴシエーションが適合するものを
見つけるのに失敗した時に、優雅にフォールバックできるような
ネゴシエーションアルゴリズムが幾つか追加されました。</
p>
<
p>サーバのページをクライアントがリクエストしたけれども、
ブラウザの送ってきた <
code>Accept-Language</
code> に合致するページが一つも
見つからなかった場合に、サーバは "No Acceptable Variant"
か "Multiple Choices" レスポンスをクライアントに返します。
このような場合には Apache が <
code>Accept-Language</
code> を無視して、
クライアントのリクエストに明示的には合致しないドキュメントを
<
directive module="mod_negotiation">ForceLanguagePriority</
directive>
ディレクティブは、これらのエラーの一つか両方をオーバーライドするために
<
directive module="mod_negotiation">LanguagePriority</
directive>
ディレクティブの内容を使ってサーバの判断を代行するようにできます。</
p>
<
p>サーバは他に適合するものが見つからなければ、
例えばクライアントが英国英語である <
code>en-GB</
code> 言語で
規格では、単に <
code>en</
code> とマークされているドキュメントを
マッチするものとすることは通常は許されていません。
(英国英語は理解できるけど一般的な英語は理解できないという読み手は
考えられないので、Accept-Language ヘッダで <
code>en-GB</
code>
を含んで <
code>en</
code> を含まないのはほぼ確実に設定の間違いである、
ですが不幸なことに、多くのクライアントではデフォルトで
しかしながら、他の言語にはマッチせず、"No Acceptable Variants"
<
directive module="mod_negotiation">LanguagePriority</
directive>
サブセット指定を無視して、<
code>en-GB</
code> を <
code>en</
code>
Apache はクライアントの許容言語リストに暗黙に
しかし、クライアントが "en-GB; q=0.9, fr; q=0.8" とリクエストして、
サーバが "en" と "fr" と設計されたドキュメントを持っている場合は、
"fr" ドキュメントが返されることに注意してください。
このような処理は、HTTP 1.1 規格との整合性を維持して、
適切に設定されたクライアントともきちんと動作するために
<
p>より高度なテクニック (Cookie や特殊な URL パス等)
Apache 2.0.47 からは、<
module>mod_negotiation</
module>
が<
a href="env.html">環境変数</
a> <
code>prefer-language</
code>
この変数が存在して、適切な言語タグが代入されているのであれば、
<
module>mod_negotiation</
module> は合致する variant
通常のネゴシエーション手順が適用されます。</
p>
<
example><
title>Example</
title>
SetEnvIf Cookie "language=(.+)" prefer-language=$1<
br />
Header append Vary cookie
<
section id="extensions"><
title>Transparent Content Negotiation
<
p>Apache は transparent content negotiation プロトコル
(RFC 2295) を次のように拡張しています。
特定のコンテントエンコーディングのみが利用可能である variant
に印を付けるために、新たに <
code>{encoding ..}</
code>
リスト中のエンコードされた variant を認識し、
<
code>Accept-Encoding</
code> リクエストヘッダに従って許容される
エンコードをもった variant は、どれでも候補 variant
RVSA/
1.0 アルゴリズム (RFC 2296) の実装が拡張されました。
RVSA/
1.0 の実装では、最適な variant が見つかるまで、
計算した品質数値は小数点以下 5 桁まで丸めません。</
p>
<
section id="naming"><
title>リンクと名前の変換に関する注意点</
title>
幾つかの異なる名前の変換を選べることになります。</
p>
<
p>典型的なファイルでは、MIME タイプ拡張子 (<
em>例えば</
em>
<
code>html</
code>) を持っていて、エンコーディング拡張子
(<
em>例えば</
em> <
code>gz</
code>) を持っているかもしれなくて、
このファイルに異なる言語 variant を用意していれば、
もちろん言語拡張子 (<
em>例えば</
em> <
code>en</
code>)
<
p>ファイル名と、それに対して使えるリンクと使えないリンクの例です:</
p>
<
table border="1" cellpadding="8" cellspacing="0">
<
columnspec><
column width=".2"/><
column width=".2"/>
<
column width=".2"/></
columnspec>
<
p>上の表を見て、拡張子なしのリンク (<
em>例えば</
em> <
code>foo</
code>)
実際のファイルタイプを隠蔽して、リンクの参照を変更することなく
<
em>例えば</
em> <
code>html</
code> から <
code>shtml</
code>
に、あるいは <
code>cgi</
code> に変更できる点です。</
p>
<
p>リンクに MIME タイプを使い続けたい (<
em>例えば</
em>
<
section id="caching"><
title>キャッシュに関する注意事項</
title>
<
p>キャッシュが一つの表現を保存しているときは、
次にその URL がリクエストされた時に、キャッシュは
最初のリクエストでキャッシュされて続くキャッシュヒットでは
間違った応答を返してしまうということになりかねません。
これを防ぐために、Apache はコンテントネゴシエーションの
また、ネゴシエーションされた応答のキャッシュを可能にする
HTTP/
1.1 プロトコルの機能も Apache はサポートします。</
p>
<
p>
HTTP/
1.0 準拠のクライアントからのリクエストに対しては、
ネゴシエーションを受けた応答のキャッシュを許すために、
<
directive module="mod_negotiation">CacheNegotiatedDocs</
directive>
このディレクティブは、サーバ設定ファイルやバーチャルホストに書くことができ、
HTTP/
1.1 クライアントからのリクエストには効力を持ちません。</
p>
<
p>
HTTP/
1.1 クライアントに対しては、レスポンスのネゴシエーション次元
を示すために <
code>Vary</
code> HTTP レスポンスヘッダを送ります。
キャッシュは、これを使って後続のリクエストに対してローカルコピーで応答できるか
ネゴシエーション次元とは関係なしにローカルコピーの使用を優先するようにするには、
<
code>force-no-vary</
code> <
a href="env.html#special">環境変数</
a>を