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