コンピューティングにおいて、コンテンツネゴシエーションとは、 HTTPの一部として定義されているメカニズムのことで、同じURIでドキュメントの異なるバージョン(より一般的には、リソースの表現)を提供することを可能にし、ユーザーエージェントが自身の機能に最適なバージョンを指定できるようにするものです。このメカニズムの典型的な使用例の一つは、画像をGIF形式またはPNG形式で提供することです。これにより、PNG画像を表示できないブラウザ(例えば、Microsoft Internet Explorer 4)にはGIFバージョンが提供されます。
リソースは複数の異なる形式で提供される場合があります。例えば、異なる言語や異なるメディア形式で提供される可能性があります。最適な選択肢を選ぶ方法の一つは、ユーザーにインデックスページを提供し、そこから最適なものを選んでもらうことですが、多くの場合、何らかの選択基準に基づいて選択を自動化することが可能です。
HTTPは、サーバー主導型(またはプロアクティブ型)、エージェント主導型(またはリアクティブ型)、透過型、およびそれらのハイブリッド型など、いくつかの異なるコンテンツネゴシエーションメカニズムを提供します。
サーバー主導型またはプロアクティブなコンテンツネゴシエーションは、サーバー上のアルゴリズムによって実行され、可能な複数の表現形式の中から最適なものが選択されます。これは通常、ユーザーエージェントが提供する受け入れ基準に基づいて行われます。
この仕組みを要約すると、ユーザーエージェントがサーバーにリクエストを送信すると、ユーザーエージェントは、理解できるメディアタイプやコンテンツ表示のその他の側面を、理解度を示す評価値とともにサーバーに通知します。より具体的には、ユーザーエージェントは、リソースの許容可能な側面とそれらの品質要因をリストしたHTTPヘッダーを提供します。サーバーは、それに基づいて、ユーザーエージェントのニーズに最も適したバージョンのリソースを提供できるようになります。
例えば、ブラウザはAccept-Language次のように設定することで、ドイツ語の情報が必要であることを示すことができます。
Accept-Language: de
ブラウザは、可能であればドイツ語を優先するが、英語も許容範囲であると、次のように設定することで示すことができる。
Accept-Language: de; q=1.0, en; q=0.5
ドイツ語の「q」(品質)係数は英語よりも高い。
複数の HTTP ヘッダーは、コンテンツ形式、具体的にはメディアタイプ、言語、およびリソースのその他のいくつかの側面を示すために、まとめて提供されることがよくあります。一般的に使用されるAcceptメディアタイプのヘッダー、Accept-Language言語ネゴシエーションのヘッダーに加えて、RFC 7231 では、文字エンコーディングとコンテンツエンコーディング (圧縮) についてもそれぞれ記述されていAccept-CharsetますAccept-Encodings。
より複雑なリクエストの例として、ブラウザが言語に関するヘッダーを送信し、ドイツ語が優先されるが英語も許容されること(上記参照)、フォーマットに関しては、HTML(text/html)が他のテキストタイプ()よりも優先されtext/*、GIF(image/gif)またはJPEG(image/jpg)画像が他の画像フォーマット()よりも優先されるimage/*が、他のメディアタイプ(*/*)は最終手段として受け入れられることなどが挙げられる。
Accept-Language: de; q=1.0, en; q=0.5 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 RFC 7231 で規定されているコンテンツ タイプと言語によるサーバー主導のコンテンツ ネゴシエーションの側面に加えて、コンテンツ ネゴシエーションの他の側面を定義する拡張機能があります。たとえば、特定の時点におけるリソースの表現のバージョンを取得するためにヘッダーを使用するMemento [ 1 ]や、データ プロファイルに準拠するリソース表現を取得するためにヘッダーを使用するIETF/W3C のContent Negotiation by Profile [ 2 ]などがあります。Accept-DatetimeAccept-Profile
RFC 7231 も、 Content Negotiation by Profile [ 2 ]のようなより新しい関連仕様も、異なるヘッダーが相反する要件を指定している場合(上記の例のように、英語の HTML ページとドイツ語の GIF 画像を選択する場合など)のトレードオフをどのように解決するかを規定していません。
エージェント主導型またはリアクティブ型のコンテンツネゴシエーションは、ユーザーエージェント内のアルゴリズムによって実行され、可能な複数の表現形式の中から選択されます。これは通常、サーバーから提供される表現形式のリストと、それらに関するメタデータに基づいて行われます。
この仕組みを要約すると、ユーザーエージェントがサーバーにリクエストを送信すると、サーバーは利用可能な表現と、各表現に関するメタデータ(コンテンツタイプ、品質、言語など)をユーザーエージェントに通知します。その後、ユーザーエージェントは選択した表現に対応する特定のURLにリクエストを再送信します。これはユーザーエージェントが自動的に選択することも、ユーザーエージェントが選択肢を提示してユーザーが直接選択することもできます。より正確には、サーバーは300 Multiple Choicesまたは406 Not Acceptable(サーバー主導の場合、ユーザーエージェントの受け入れ基準は提供されるが、サーバーが自動的に選択できない場合)のいずれかで応答します。残念ながら、HTTPでは表現とメタデータのリストの形式や選択メカニズムは規定されていません。