1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 3<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"><head><!-- 4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 5 This file is generated from xml source: DO NOT EDIT 6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 7 --> 8<title>コンテントネゴシエーション - Apache HTTP サーバ</title> 9<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> 10<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> 11<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="/style/css/prettify.css" /> 12<script src="/style/scripts/prettify.min.js" type="text/javascript"> 13</script> 14 15<link href="/images/favicon.ico" rel="shortcut icon" /></head> 16<body id="manual-page"><div id="page-header"> 17<p class="menu"><a href="/mod/">モジュール</a> | <a href="/mod/directives.html">ディレクティブ</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">用語</a> | <a href="/sitemap.html">サイトマップ</a></p> 18<p class="apache">Apache HTTP サーバ バージョン 2.4</p> 19<img alt="" src="/images/feather.gif" /></div> 20<div class="up"><a href="./"><img title="<-" alt="<-" src="/images/left.gif" /></a></div> 21<div id="path"> 22<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP サーバ</a> > <a href="http://httpd.apache.org/docs/">ドキュメンテーション</a> > <a href="./">バージョン 2.4</a></div><div id="page-content"><div id="preamble"><h1>コンテントネゴシエーション</h1> 23<div class="toplang"> 24<p><span>翻訳済み言語: </span><a href="/en/content-negotiation.html" hreflang="en" rel="alternate" title="English"> en </a> | 25<a href="/fr/content-negotiation.html" hreflang="fr" rel="alternate" title="Français"> fr </a> | 26<a href="/ja/content-negotiation.html" title="Japanese"> ja </a> | 27<a href="/ko/content-negotiation.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | 28<a href="/tr/content-negotiation.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a></p> 29</div> 30<div class="outofdate">この日本語訳はすでに古くなっている 31 可能性があります。 32 最近更新された内容を見るには英語版をご覧下さい。 33 </div> 34 35 36 <p>Apache は HTTP/1.1 の規格に記述されているコンテントネゴシエーションを 37 サポートしています。 38 ブラウザにより提供されたメディアタイプ、 39 言語、文字セット、エンコーディングの優先傾向に基づいて、 40 最適なリソースの表現を選択できます。 41 また、不完全なネゴシエーション情報を送ってくるブラウザからのリクエストを 42 もっと賢く取り扱えるよう、いくつか機能も実装してあります。</p> 43 44 <p>コンテントネゴシエーションは 45 <code class="module"><a href="/mod/mod_negotiation.html">mod_negotiation</a></code> 46 モジュールによって提供されていて、デフォルトで組み込まれています。</p> 47</div> 48<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#about">コンテントネゴシエーションについて</a></li> 49<li><img alt="" src="/images/down.gif" /> <a href="#negotiation">Apache におけるネゴシエーション</a></li> 50<li><img alt="" src="/images/down.gif" /> <a href="#methods">ネゴシエーション方法</a></li> 51<li><img alt="" src="/images/down.gif" /> <a href="#better">品質の値を変える</a></li> 52<li><img alt="" src="/images/down.gif" /> <a href="#extensions">Transparent Content Negotiation 53の拡張</a></li> 54<li><img alt="" src="/images/down.gif" /> <a href="#naming">リンクと名前の変換に関する注意点</a></li> 55<li><img alt="" src="/images/down.gif" /> <a href="#caching">キャッシュに関する注意事項</a></li> 56</ul><ul class="seealso"><li><a href="#comments_section">コメント</a></li></ul></div> 57<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 58<div class="section"> 59<h2><a name="about" id="about">コンテントネゴシエーションについて</a></h2> 60 61 <p>リソースは、幾つか異なった表現で利用できる場合があります。 62 例えば、異なる言語や異なるメディアタイプ、 63 またはそれらの組み合わせで利用できるかも知れません。 64 もっとも適した選択をする方法の一つには、インデックスページを 65 ユーザに見せて、ユーザに選んでもらう方法があります。 66 しかし、サーバが自動的に選ぶことができる場合が多くあります。 67 これは、ブラウザがリクエスト毎に、 68 どの表現を嗜好するかという情報を送ることで動作しています。 69 例えばブラウザは、可能ならフランス語で情報を見たい、 70 不可能ならその代わりに英語でもよいと、 71 自分の嗜好を知らせることができます。 72 ブラウザはリクエストのヘッダで自分の優先傾向を知らせます。 73 フランス語のみの表現を要求する場合は、ブラウザは次を送ります。</p> 74 75<div class="example"><p><code>Accept-Language: fr</code></p></div> 76 77 <p>この優先傾向は、選択可能な表現が存在して、 78 言語によって様々な表現がある場合にのみ適用される 79 ということに注意してください。</p> 80 81 <p>もっと複雑なリクエストの例を挙げましょう。 82 このブラウザはフランス語と英語を受け付ける、しかしフランス語を好む、 83 そして様々なメディアタイプを受け付けるが、 84 プレインテキストや他のタイプよりは HTML を好む、 85 他のメディアタイプよりは GIF や JPEG を好む、しかし最終手段として 86 他のメディアタイプも受け付ける、と設定されています。</p> 87 88<div class="example"><p><code> 89 Accept-Language: fr; q=1.0, en; q=0.5<br /> 90 Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1 91</code></p></div> 92 93 <p>Apache は HTTP/1.1 規格で定義されている 'server 94 driven' コンテントネゴシエーションをサポートしています。 95 <code>Accept</code>, <code>Accept-Language</code>, 96 <code>Accept-Charset</code>, <code>Accept-Encoding</code> 97 リクエストヘッダを完全にサポートしています。Apache は 98 'transparent' コンテントネゴシエーションもサポートしていますが、 99 これは RFC 2295 と RFC 2296 で定義されている試験的な 100 ネゴシエーションプロトコルです。 101 これらの RFCで定義されている 'feature negotiation' 102 はサポートしていません。</p> 103 104 <p><strong>リソース</strong>とは URI 105 で特定される概念上のもののことです (RFC 2396)。 Apache 106 のような HTTP サーバは、その名前空間の中での 107 リソースの<strong>表現</strong>へのアクセスを提供します。 108 それぞれの表現は 109 定義されたメディアタイプ、文字セット、エンコーディング等の 110 付属した、バイト列の形式です。 111 それぞれのリソースはある時点で 0 個、1 個、それ以上の表現と 112 関連付けられる可能性があります。複数の表現が利用できる場合は、 113 リソースは<strong>ネゴシエーション可能である</strong>とされ、 114 個々の表現は <strong>variant</strong> と呼ばれます。 115 ネゴシエーション可能なリソースの variant が異なる、 116 その状態を指して、 117 ネゴシエーションの<strong>次元</strong>と呼びます。</p> 118</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 119<div class="section"> 120<h2><a name="negotiation" id="negotiation">Apache におけるネゴシエーション</a></h2> 121 122 <p>リソースをネゴシエーションするためには、 123 サーバは variant それぞれについての情報を知っておく必要があります。 124 これは以下の二つの方法のどちらかで行われます。</p> 125 126 <ul> 127 <li>タイプマップ 128 (<em>すなわち</em> <code>*.var</code> ファイル) 129 を使う方法。 これは variant 130 を明示的に挙げているファイルを指定します。</li> 131 132 <li>'Multiviews' 133 を使って、サーバが暗黙の内にファイル名にパターン照合を 134 行なってその結果から選択する方法。</li> 135 </ul> 136 137 <h3><a name="type-map" id="type-map">type-map ファイルを使う</a></h3> 138 139 <p>タイプマップは <code>type-map</code> ハンドラ 140 (もしくは、古い Apache 141 の設定と下位互換である <a class="glossarylink" href="/glossary.html#mime-type" title="用語集を参照">MIME タイプ</a> 142 <code>application/x-type-map</code>) 143 に関連付けられたドキュメントです。 144 この機能を使うためには、あるファイルの拡張子を 145 <code>type-map</code> 146 として定義するようなハンドラを、 147 設定ファイル中に置く必要があることに注意してください。 148 これは</p> 149 150<div class="example"><p><code>AddHandler type-map .var</code></p></div> 151 152 <p>をサーバ設定ファイル中に書くことが一番良い方法です。</p> 153 154 <p>タイプマップファイルは記述するリソースと同じ名前を持っていて、 155 利用可能な variant それぞれのエントリを持っている必要があります。 156 そして、このエントリは連続した HTTP のヘッダ行で構成されます。 157 異なる variant のためのエントリは空行で区切られています。 158 エントリ中に空行が複数あってはいけません。 159 習慣的には、マップファイルは全体を結合したもののエントリから始まります 160 (しかしこれは必須ではなく、あったとしても無視されるものです)。 161 次に例を示します。このファイルはリソース <code>foo</code> 162 を記述しているので、<code>foo.var</code> という名前になります。</p> 163 164<div class="example"><p><code> 165 URI: foo<br /> 166<br /> 167 URI: foo.en.html<br /> 168 Content-type: text/html<br /> 169 Content-language: en<br /> 170<br /> 171 URI: foo.fr.de.html<br /> 172 Content-type: text/html;charset=iso-8859-2<br /> 173 Content-language: fr, de<br /> 174</code></p></div> 175 <p>たとえ MultiViews を使用するようになっていたとしても、 176 ファイル名の拡張子よりタイプマップの方が優先権を持つということにも 177 注意してください。 178 variant の品質が違うときは、この画像のように (JPEG, GIF, ASCII 179 アートがあります) メディアタイプの "qs" 180 パラメータで指定されます。</p> 181 182<div class="example"><p><code> 183 URI: foo<br /> 184<br /> 185 URI: foo.jpeg<br /> 186 Content-type: image/jpeg; qs=0.8<br /> 187<br /> 188 URI: foo.gif<br /> 189 Content-type: image/gif; qs=0.5<br /> 190<br /> 191 URI: foo.txt<br /> 192 Content-type: text/plain; qs=0.01<br /> 193</code></p></div> 194 195 <p>qs 値の範囲は 0.000 から 1.000 です。qs 値が 196 0.000 の variant は決して 197 選択されないことに注意してください。'qs' 値のない variant 198 は qs 値 1.0 を 与えられます。qs 199 パラメータはクライアントの能力に関係無く、他の variant と 200 比較したときの variant 201 の相対的な「品質」を示します。 202 例えば、写真を表現しようとしているときは JPEG 203 ファイルの方が普通は ASCII 204 ファイルよりも高い品質になります。しかし、リソースが元々 205 ASCII アートで表現されているときは、ASCII ファイルの 206 方が JPEG ファイルよりも高い品質になります。このように、qs 207 は 表現されるリソースの性質によって variant 208 毎に特有の値を取ります。</p> 209 210 <p>認識されるヘッダの一覧は 211 <a href="mod/mod_negotiation.html#typemaps">mod_negotiation</a> 212 ドキュメントにあります。</p> 213 214 215<h3><a name="multiviews" id="multiviews">Multiviews</a></h3> 216 217 <p><code>MultiViews</code> はディレクトリ毎のオプションで、 218 <code>httpd.conf</code>ファイルの 219 <code class="directive"><a href="/mod/core.html#directory"><Directory></a></code>, 220 <code class="directive"><a href="/mod/core.html#location"><Location></a></code>, 221 <code class="directive"><a href="/mod/core.html#files"><Files></a></code> 222 セクション中や、(<code class="directive"><a href="/mod/core.html#allowoverride">AllowOverride</a></code> 223 が適切な値に 設定されていると) <code>.htaccess</code> 224 ファイルで <code class="directive"><a href="/mod/core.html#options">Options</a></code> 225 ディレクティブによって設定することができます。 226 <code>Options All</code> は 227 <code>MultiViews</code> 228 をセットしないことに注意してください。明示的に 229 その名前を書く必要があります。</p> 230 231 <p><code>MultiViews</code> の効果は以下のようになります: 232 サーバが <code>/some/dir/foo</code> 233 へのリクエストを受け取り、<code>/some/dir</code> で 234 <code>MultiViews</code> が有効であって、 235 <code>/some/dir/foo</code> が存在<em>しない</em>場合、 236 サーバはディレクトリを読んで <code>foo.*</code> 237 にあてはまる全てのファイルを探し、 238 事実上それらのファイルをマップするタイプマップを作ります。 239 そのとき、メディアタイプとコンテントエンコーディングは、そのファイル名を 240 直接指定したときと同じものが割り当てられます。 241 それからクライアントの要求に一番合うものを選びます。</p> 242 243 <p>サーバがディレクトリの索引を作ろうとしている場合、 244 <code>MultiViews</code> 245 は <code class="directive"><a href="/mod/mod_dir.html#directoryindex">DirectoryIndex</a></code> 246 ディレクティブで指定されたファイルを探す過程にも 247 適用されます。設定ファイルに</p> 248<div class="example"><p><code>DirectoryIndex index</code></p></div> 249 <p>が書かれていて、<code>index.html</code> と 250 <code>index.html3</code> が 251 両方存在していると、サーバはその中からどちらかを適当に選びます。 252 もしその両方が存在せずに <code>index.cgi</code> 253 が存在していると、 サーバはそれを実行します。</p> 254 255 <p>もしディレクトリを読んでいる際に、 256 文字セット、コンテントタイプ、言語、エンコーディングを 257 指定するための <code>mod_mime</code> 258 で認識できる拡張子を持たないファイルが見つかると、結果は 259 <code class="directive"><a href="/mod/mod_mime.html#multiviewsmatch">MultiViewsMatch</a></code> 260 ディレクティブの設定に依存します。このディレクティブは 261 ハンドラ、フィルタ、他のファイル拡張子タイプのどれが 262 MultiViews ネゴシエーションで使用できるかを決定します。</p> 263 264</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 265<div class="section"> 266<h2><a name="methods" id="methods">ネゴシエーション方法</a></h2> 267 268 <p>Apache はリソースの variant の一覧を、タイプマップファイルか 269 ディレクトリ内のファイル名からかで取得した後、 270 「最適な」 variant を決定するために二つの方法の 271 どちらかを起動します。 272 Apache のコンテントネゴシエーションの機能を使うために、 273 どのようにしてこの調停が行われるか詳細を知る必要はありません。 274 しかしながら、この文書の残りでは関心のある人のために、 275 使用されている方法について説明しています。</p> 276 277 <p>ネゴシエーション方法は二つあります。</p> 278 279 <ol> 280 <li>通常は <strong>Apache のアルゴリズムを用いた Server 281 driven negotiation</strong> が使用されます。Apache 282 のアルゴリズムは後に詳細に説明されています。 283 このアルゴリズムが使用された場合、Apache 284 はより良い結果になるように、特定の次元において品質の値を 285 「変える」ことができます。Apache 286 が品質の値を変える方法は後で詳細に説明されています。</li> 287 288 <li>RFC 2295 289 で定義されている機構を用いてブラウザが特に指定した場合、 290 <strong>transparent content negotiation</strong> 291 が使用されます。このネゴシエーション方法では、「最適な」 292 variant の決定をブラウザが完全に制御することができます。 293 ですから、結果はブラウザが使用しているアルゴリズムに依存します。 294 Transparent negotiation の処理の過程で、ブラウザは RFC 2296 295 で 定義されている 'remote variant selection algorithm' 296 を実行するように頼むことができます。</li> 297 </ol> 298 299<h3><a name="dimensions" id="dimensions">ネゴシエーションの次元</a></h3> 300 301 <table> 302 303 <tr valign="top"> 304 <th>次元</th> 305 306 <th>説明</th> 307 </tr> 308 309 <tr valign="top"> 310 <td>メディアタイプ</td> 311 312 <td>ブラウザは <code>Accept</code> 313 ヘッダフィールドで優先傾向を指定します。 314 アイテムそれぞれは、関連した品質数値を持つことができます。 315 variant の説明も品質数値を持つことができます 316 ("qs" パラメータをご覧下さい)。</td> 317 </tr> 318 319 <tr valign="top"> 320 <td>言語</td> 321 322 <td>ブラウザは <code>Accept-Language</code> 323 ヘッダフィールドで優先傾向を指定します。 324 要素それぞれに品質数値を持たせることができます。 325 variants は 0 か 1 つかそれ以上の言語と 326 関連づけることができます。</td> 327 </tr> 328 329 <tr valign="top"> 330 <td>エンコーディング</td> 331 332 <td>ブラウザは <code>Accept-Encoding</code> 333 ヘッダフィールドで優先傾向を指定します。 334 要素それぞれに品質数値を持たせることができます。</td> 335 </tr> 336 337 <tr valign="top"> 338 <td>文字セット</td> 339 340 <td>ブラウザは <code>Accept-Charset</code> 341 ヘッダフィールドで優先傾向を指定します。 342 要素それぞれに品質数値を持たせることができます。 343 variant はメディアタイプのパラメータとして文字セットを 344 指定することもできます。</td> 345 </tr> 346 </table> 347 348 349<h3><a name="algorithm" id="algorithm">Apache ネゴシエーションアルゴリズム</a></h3> 350 351 <p>ブラウザに返す「最適な」variant を (もしあれば) 選択するように 352 Apache は次のアルゴリズムを使うことができます。 353 このアルゴリズムを設定により変更することはできません。 354 次のように動作します:</p> 355 356 <ol> 357 <li>まずはじめに、ネゴシエーションの次元それぞれについて適切な 358 <em>Accept*</em> ヘッダフィールドを調べ、 359 variant それぞれに品質を割り当てます。 360 もしある次元の <em>Accept*</em> ヘッダでその variant 361 が許容できないことが示されていれば、それを削除します。 362 variant が一つも残っていなければ、ステップ 4 に行きます。</li> 363 364 <li> 365 消去法で「最適な」 variant を選びます。 366 次のテストが順番に適用されます。 367 テストで選択されなかった variant は削除されていきます。 368 テスト後 variant が一つだけ残っていれば、それを最適なものとして 369 ステップ 3 に進みます。 370 複数 variant が残っていれば、次のテストに進みます。 371 372 <ol> 373 <li>variant のメディアタイプの品質数値と <code>Accept</code> 374 ヘッダの品質数値との積を計算して、最高値の variant 375 を選びます。</li> 376 377 <li>言語品質数値が最高の variant を選びます。</li> 378 379 <li>(もしあれば) <code>Accept-Language</code> ヘッダの言語順か、 380 (もしあれば) 381 <code class="directive"><a href="/mod/mod_negotiation.html#languagepriority">LanguagePriority</a></code> 382 ディレクティブの言語順で最適な言語の variant を選びます。</li> 383 384 <li>最高「レベル」のメディアパラメータ 385 (text/html メディアタイプのバージョンを与えるために使われます) 386 を持つ variant を選びます。</li> 387 388 <li><code>Accept-Charset</code> ヘッダ行で与えられている最高の文字セット 389 メディアパラメータを持つ variant を選びます。 390 明示的に除外されていない限り、ISO-8859-1 391 が許容されるようになっています。 392 <code>text/*</code> メディアタイプであるけれども 393 特定の文字セットに明示的に関連づけられているわけではない 394 variant は ISO-8859-1 であると仮定されます。</li> 395 396 <li>ISO-8859-1 <em>ではない</em>文字セットメディアパラメータと 397 関連づけられている variant を選びます。 398 そのような variant がない場合は、代わりに全ての 399 variant を選びます。</li> 400 401 <li>最適なエンコーディングの variant を選びます。 402 もし user-agent が許容するエンコーディングがあれば、 403 その variant のみを選びます。 404 そうではなく、もしエンコードされたものとそうでない 405 variant が混ざって存在していたらエンコードされていない 406 variant のみを選びます。 407 variant が全部エンコードされているか 408 variant が全部エンコードされていないという場合は、 409 全ての variant を選びます。</li> 410 411 <li>内容の最も短い variant を選びます。</li> 412 413 <li>残っている variant の最初のものを選びます。 414 タイプマップファイルの最初にリストされているか、 415 variant がディレクトリから最初に読み込まれる時に 416 ASCII順でソートしてファイル名が先頭になったか、のどちらかです。</li> 417 </ol> 418 </li> 419 420 <li>アルゴリズムを使って一つの「最適な」variant を選びましたので、 421 それを応答として返します。ネゴシエーションの次元を指定するために 422 HTTP レスポンスヘッダ <code>Vary</code> が設定されます 423 (リソースのキャッシュをする時に、 424 ブラウザやキャッシュはこの情報を使うことができます)。 425 以上で終わり。</li> 426 427 <li>ここに来たということは、variant が一つも選択されなかった 428 (ブラウザが許容するものがなかったため) ということです。 429 406 ステータス ("No Acceptable representation" を意味する) 430 が、利用可能な variant のリストのついた HTML 431 ドキュメントとともに返されます。 432 相違の次元を示す HTTP <code>Vary</code> ヘッダも設定されます。</li> 433 </ol> 434 435</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 436<div class="section"> 437<h2><a name="better" id="better">品質の値を変える</a></h2> 438 439 <p>上記の Apache ネゴシエーションアルゴリズムの厳格な解釈で 440 得られるであろう値から、Apache は品質数値を時々変えます。 441 これは、このアルゴリズムで完全ではない、あるいは正確でない情報を送る 442 ブラウザ向けによりよい結果を得るために行われます。 443 かなりポピュラーなブラウザで、もしないと間違った variant 444 を選択する結果になってしまうような <code>Accept</code> 445 ヘッダ情報を送るものもあります。 446 ブラウザが完全で正しい情報を送っていれば、 447 この数値変化は適用されません。</p> 448 449<h3><a name="wildcards" id="wildcards">メディアタイプとワイルドカード</a></h3> 450 451 <p><code>Accept:</code> リクエストヘッダはメディアタイプの優先傾向を指定します。 452 これはまた、"image/*" や "*/*" 453 といった「ワイルドカード」メディアタイプを含むことができます。 454 ここで * は任意の文字列にマッチします。 455 ですから、次の:</p> 456 457<div class="example"><p><code>Accept: image/*, */*</code></p></div> 458 459 <p>を含むリクエストは、"image/" ではじまるタイプ全てが許容できる、 460 そして他のどんなタイプも許容できる 461 (この場合はじめの "image/*" は冗長になります) 462 ことを示します。 463 扱うことのできる明示的なタイプに加えて、機械的に 464 ワイルドカードを送るブラウザもあります。例えば:</p> 465 466<div class="example"><p><code> 467 Accept: text/html, text/plain, image/gif, image/jpeg, */* 468</code></p></div> 469 <p>こうすることの狙いは、明示的にリストしているタイプが優先されるけれども、 470 異なる表現が利用可能であればそれでも良い、ということです。 471 しかしながら、上の基本的なアルゴリズムでは、 472 */* ワイルドカードは他の全てのタイプと全く同等なので優先されません。 473 ブラウザは */* にもっと低い品質 (優先) 474 値を付けてリクエストを送るべきなのです。例えば:</p> 475<div class="example"><p><code> 476 Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01 477</code></p></div> 478 <p>明示的なタイプには品質数値が付けられていませんので、 479 デフォルトの 1.0 (最高値) の優先になります。 480 ワイルドカード */* は低い優先度 0.01 を与えられているので、 481 明示的にリストされているタイプに合致する variant がない場合にのみ、 482 他のタイプが返されます。</p> 483 484 <p>もし <code>Accept:</code> ヘッダが q 値を全く含んで<em>いなければ</em>、 485 望みの挙動をするために、 486 Apache は "*/*" があれば 0.01 の q 値を設定します。 487 また、"type/*" の形のワイルドカードには 0.02 の q 値を設定します 488 (ですからこれらは "*/*" のマッチよりも優先されます)。 489 もし <code>Accept:</code> ヘッダ中のメディアタイプのどれかが q 490 値を含んでいれば、これらの特殊な値は適応<em>されず</em>、 491 正しい情報を送るブラウザからのリクエストは期待通りに 492 動作するようになります。</p> 493 494 495<h3><a name="exceptions" id="exceptions">言語ネゴシエーションの例外処理</a></h3> 496 497 <p>Apache 2.0 では新たに、言語ネゴシエーションが適合するものを 498 見つけるのに失敗した時に、優雅にフォールバックできるような 499 ネゴシエーションアルゴリズムが幾つか追加されました。</p> 500 501 <p>サーバのページをクライアントがリクエストしたけれども、 502 ブラウザの送ってきた <code>Accept-Language</code> に合致するページが一つも 503 見つからなかった場合に、サーバは "No Acceptable Variant" 504 か "Multiple Choices" レスポンスをクライアントに返します。 505 これらのエラーメッセージを返さないように、 506 このような場合には Apache が <code>Accept-Language</code> を無視して、 507 クライアントのリクエストに明示的には合致しないドキュメントを 508 提供するように設定できます。 509 <code class="directive"><a href="/mod/mod_negotiation.html#forcelanguagepriority">ForceLanguagePriority</a></code> 510 ディレクティブは、これらのエラーの一つか両方をオーバーライドするために 511 使用できて、 512 <code class="directive"><a href="/mod/mod_negotiation.html#languagepriority">LanguagePriority</a></code> 513 ディレクティブの内容を使ってサーバの判断を代行するようにできます。</p> 514 515 <p>サーバは他に適合するものが見つからなければ、 516 言語サブセットで適合するものを試そうともします。 517 例えばクライアントが英国英語である <code>en-GB</code> 言語で 518 ドキュメントをリクエストした場合、サーバは HTTP/1.1 519 規格では、単に <code>en</code> とマークされているドキュメントを 520 マッチするものとすることは通常は許されていません。 521 (英国英語は理解できるけど一般的な英語は理解できないという読み手は 522 考えられないので、Accept-Language ヘッダで <code>en-GB</code> 523 を含んで <code>en</code> を含まないのはほぼ確実に設定の間違いである、 524 ということに注意してください。 525 ですが不幸なことに、多くのクライアントではデフォルトで 526 このような設定になっています。) 527 しかしながら、他の言語にはマッチせず、"No Acceptable Variants" 528 エラーを返したり、 529 <code class="directive"><a href="/mod/mod_negotiation.html#languagepriority">LanguagePriority</a></code> 530 にフォールバックしようとしているときは、 531 サブセット指定を無視して、<code>en-GB</code> を <code>en</code> 532 にマッチします。 533 Apache はクライアントの許容言語リストに暗黙に 534 非常に低い品質値の親言語を加えることになります。 535 しかし、クライアントが "en-GB; q=0.9, fr; q=0.8" とリクエストして、 536 サーバが "en" と "fr" と設計されたドキュメントを持っている場合は、 537 "fr" ドキュメントが返されることに注意してください。 538 このような処理は、HTTP 1.1 規格との整合性を維持して、 539 適切に設定されたクライアントともきちんと動作するために 540 必要です。</p> 541 542 <p>より高度なテクニック (Cookie や特殊な URL パス等) 543 においてもユーザの言語選択をサポートするため、 544 Apache 2.0.47 からは、<code class="module"><a href="/mod/mod_negotiation.html">mod_negotiation</a></code> 545 が<a href="env.html">環境変数</a> <code>prefer-language</code> 546 を認識するようになりました。 547 この変数が存在して、適切な言語タグが代入されているのであれば、 548 <code class="module"><a href="/mod/mod_negotiation.html">mod_negotiation</a></code> は合致する variant 549 を選択しようとします。合致するものが無ければ、 550 通常のネゴシエーション手順が適用されます。</p> 551 552 <div class="example"><h3>Example</h3><p><code> 553 SetEnvIf Cookie "language=(.+)" prefer-language=$1<br /> 554 Header append Vary cookie 555 </code></p></div> 556 557</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 558<div class="section"> 559<h2><a name="extensions" id="extensions">Transparent Content Negotiation 560の拡張</a></h2> 561 562<p>Apache は transparent content negotiation プロトコル 563(RFC 2295) を次のように拡張しています。 564特定のコンテントエンコーディングのみが利用可能である variant 565に印を付けるために、新たに <code>{encoding ..}</code> 566要素を variant リスト中に使っています。 567リスト中のエンコードされた variant を認識し、 568<code>Accept-Encoding</code> リクエストヘッダに従って許容される 569エンコードをもった variant は、どれでも候補 variant 570として使用するように、 571RVSA/1.0 アルゴリズム (RFC 2296) の実装が拡張されました。 572RVSA/1.0 の実装では、最適な variant が見つかるまで、 573計算した品質数値は小数点以下 5 桁まで丸めません。</p> 574</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 575<div class="section"> 576<h2><a name="naming" id="naming">リンクと名前の変換に関する注意点</a></h2> 577 578 <p>言語ネゴシエーションを使っている場合は、 579 ファイルが一つ以上の拡張子を持てて、 580 拡張子の順番は通常は考慮されない 581 (詳細は <a href="mod/mod_mime.html#multipleext">mod_mime</a> 582 を参照) ので、 583 幾つかの異なる名前の変換を選べることになります。</p> 584 585 <p>典型的なファイルでは、MIME タイプ拡張子 (<em>例えば</em> 586 <code>html</code>) を持っていて、エンコーディング拡張子 587 (<em>例えば</em> <code>gz</code>) を持っているかもしれなくて、 588 このファイルに異なる言語 variant を用意していれば、 589 もちろん言語拡張子 (<em>例えば</em> <code>en</code>) 590 を持っているでしょう。</p> 591 592 <p>例:</p> 593 594 <ul> 595 <li>foo.en.html</li> 596 597 <li>foo.html.en</li> 598 599 <li>foo.en.html.gz</li> 600 </ul> 601 602 <p>ファイル名と、それに対して使えるリンクと使えないリンクの例です:</p> 603 604 <table class="bordered"> 605 606 <tr> 607 <th>ファイル名</th> 608 609 <th>使えるリンク</th> 610 611 <th>使えないリンク</th> 612 </tr> 613 614 <tr> 615 <td><em>foo.html.en</em></td> 616 617 <td>foo<br /> 618 foo.html</td> 619 620 <td>-</td> 621 </tr> 622 623 <tr> 624 <td><em>foo.en.html</em></td> 625 626 <td>foo</td> 627 628 <td>foo.html</td> 629 </tr> 630 631 <tr> 632 <td><em>foo.html.en.gz</em></td> 633 634 <td>foo<br /> 635 foo.html</td> 636 637 <td>foo.gz<br /> 638 foo.html.gz</td> 639 </tr> 640 641 <tr> 642 <td><em>foo.en.html.gz</em></td> 643 644 <td>foo</td> 645 646 <td>foo.html<br /> 647 foo.html.gz<br /> 648 foo.gz</td> 649 </tr> 650 651 <tr> 652 <td><em>foo.gz.html.en</em></td> 653 654 <td>foo<br /> 655 foo.gz<br /> 656 foo.gz.html</td> 657 658 <td>foo.html</td> 659 </tr> 660 661 <tr> 662 <td><em>foo.html.gz.en</em></td> 663 664 <td>foo<br /> 665 foo.html<br /> 666 foo.html.gz</td> 667 668 <td>foo.gz</td> 669 </tr> 670 </table> 671 672 <p>上の表を見て、拡張子なしのリンク (<em>例えば</em> <code>foo</code>) 673 がいつでも使えることに気が付くでしょう。 674 この利点は、ドキュメントとして応答するファイルの 675 実際のファイルタイプを隠蔽して、リンクの参照を変更することなく 676 後からファイルを変更できる、 677 <em>例えば</em> <code>html</code> から <code>shtml</code> 678 に、あるいは <code>cgi</code> に変更できる点です。</p> 679 680 <p>リンクに MIME タイプを使い続けたい (<em>例えば</em> 681 <code>foo.html</code>)時は、言語拡張子は 682 (エンコーディング拡張子もあればそれも含めて) 683 MIME タイプ拡張子の右側になければなりません 684 (<em>例えば</em> <code>foo.html.en</code>)。</p> 685</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 686<div class="section"> 687<h2><a name="caching" id="caching">キャッシュに関する注意事項</a></h2> 688 689 <p>キャッシュが一つの表現を保存しているときは、 690 リクエスト URL と関連づけられています。 691 次にその URL がリクエストされた時に、キャッシュは 692 保存されている表現を使用できます。しかし、 693 リソースがサーバでネゴシエーション可能であれば、 694 最初のリクエストでキャッシュされて続くキャッシュヒットでは 695 間違った応答を返してしまうということになりかねません。 696 これを防ぐために、Apache はコンテントネゴシエーションの 697 後に返された応答全てに、HTTP/1.0 クライアントでは 698 キャッシュ不可能の印をつけます。 699 また、ネゴシエーションされた応答のキャッシュを可能にする 700 HTTP/1.1 プロトコルの機能も Apache はサポートします。</p> 701 702 <p>HTTP/1.0 準拠のクライアントからのリクエストに対しては、 703 (ブラウザであろうとキャッシュであろうと) 704 ネゴシエーションを受けた応答のキャッシュを許すために、 705 <code class="directive"><a href="/mod/mod_negotiation.html#cachenegotiateddocs">CacheNegotiatedDocs</a></code> 706 ディレクティブを使用できます。 707 このディレクティブは、サーバ設定ファイルやバーチャルホストに書くことができ、 708 引数をとりません。 709 HTTP/1.1 クライアントからのリクエストには効力を持ちません。</p> 710 711 <p>HTTP/1.1 クライアントに対しては、レスポンスのネゴシエーション次元 712 を示すために <code>Vary</code> HTTP レスポンスヘッダを送ります。 713 キャッシュは、これを使って後続のリクエストに対してローカルコピーで応答できるか 714 どうかを決定できます。 715 ネゴシエーション次元とは関係なしにローカルコピーの使用を優先するようにするには、 716 <code>force-no-vary</code> <a href="env.html#special">環境変数</a>を 717 設定します。</p> 718 719</div></div> 720<div class="bottomlang"> 721<p><span>翻訳済み言語: </span><a href="/en/content-negotiation.html" hreflang="en" rel="alternate" title="English"> en </a> | 722<a href="/fr/content-negotiation.html" hreflang="fr" rel="alternate" title="Français"> fr </a> | 723<a href="/ja/content-negotiation.html" title="Japanese"> ja </a> | 724<a href="/ko/content-negotiation.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | 725<a href="/tr/content-negotiation.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a></p> 726</div><div class="top"><a href="#page-header"><img src="/images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">コメント</a></h2><div class="warning"><strong>Notice:</strong><br />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 again 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 Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div> 727<script type="text/javascript"><!--//--><![CDATA[//><!-- 728var comments_shortname = 'httpd'; 729var comments_identifier = 'http://httpd.apache.org/docs/2.4/content-negotiation.html'; 730(function(w, d) { 731 if (w.location.hostname.toLowerCase() == "httpd.apache.org") { 732 d.write('<div id="comments_thread"><\/div>'); 733 var s = d.createElement('script'); 734 s.type = 'text/javascript'; 735 s.async = true; 736 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; 737 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); 738 } 739 else { 740 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); 741 } 742})(window, document); 743//--><!]]></script></div><div id="footer"> 744<p class="apache">Copyright 2014 The Apache Software Foundation.<br />この文書は <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> のライセンスで提供されています。.</p> 745<p class="menu"><a href="/mod/">モジュール</a> | <a href="/mod/directives.html">ディレクティブ</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">用語</a> | <a href="/sitemap.html">サイトマップ</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!-- 746if (typeof(prettyPrint) !== 'undefined') { 747 prettyPrint(); 748} 749//--><!]]></script> 750</body></html>