[12] RFC 7231 は、利用者エージェントの希望に基づき鯖が選択する proactive negotiation (旧・鯖駆動折衝) と鯖のリストに基づき利用者エージェントが選択する reactive negotiation (旧・エージェント駆動折衝) に分類しています。更に、その他の内容折衝の実現例として、 複数の部分を含む表現から利用者エージェントが選択する条件付き内容、 表現がスクリプトを含んでいる活性内容、 中間器が選択を行う透過内容折衝を挙げています。 >>9
[19] 内容折衝により鯖側で行う処理にはいくつかの種類があります。
[20] 対象資源から応答で返す表現の決定が内容折衝の主目的です。 この場合は認証などの処理よりも後、 条件付き要求や範囲要求よりは前に内容折衝の処理が行われます。
[21] エラーを表す応答や POST
の処理結果を表す応答など対象資源自体ではない応答の表現の決定にも内容折衝は用いられます。これは認証などの処理でのエラーを表すこともあれば、条件付き要求などの処理のエラーを表すこともあります。またこの場合は内容折衝の後から条件付き要求や範囲要求が適用されることはありません。
[22] 内容折衝の処理自体がエラーとなることもあります。その場合のエラーを表す応答にも内容折衝を適用できることもありますが、再帰的にエラーとなっては困りますから、実装時は注意が必要です。
[28] 内容折衝が広く普及しない背景には、実用上の様々な問題があります。
[29] 内容折衝のための鯖の設定は必ずしも簡単ではありません。 Apache MultiViews のように比較的容易な方法で有効にすることができる実装もありますが、 優先度を適切に設定することが難しいなど、活用するのは簡単ではありません。
[30] 内容折衝のために複数のファイルを用意する場合、それらの更新時に内容を同期する必要がありますが、 しばしばその作業は煩雑で忘れがちです。正しい状態を維持することは必ずしも簡単ではありません。
[31] 内容折衝を導入することで、色々なシステムに悪影響が出ることがあります。 これは必ずしも関係するシステム上やプロトコル上の欠陥ではなく、 仕組み上は対応していたとしても運用するのが難しいものも含みます。 例えば次のようなものがあります。
[34] 内容折衝により見る人によって得られる内容が異なるということは、 URL やリンクを他の人に提示しても、その人が同じものを見るとは限らないことになります。 これは多くの人が持っている暗黙の前提に反するので、混乱の元になります。
[49] RFC 2936 - HTTP MIME Type Handler Detection, , https://tools.ietf.org/html/rfc2936
[47] draft-ietf-http-negotiate-scenario-02 - Scenarios for the Delivery of Negotiated Content, , https://tools.ietf.org/html/draft-ietf-http-negotiate-scenario-02
[48] RFC 2703 - Protocol-independent Content Negotiation Framework, , https://tools.ietf.org/html/rfc2703
[50] RFC 3297 - Content Negotiation for Messaging Services based on Email, , https://tools.ietf.org/html/rfc3297
[51] RFC Errata Report » RFC Editor, https://www.rfc-editor.org/errata_search.php?rfc=3297
[53] RFC 4249: Implementer-Friendly Specification of Message and MIME-Part Header Fields and Field Components, https://www.rfc-editor.org/rfc/rfc4249.html#section-3.1.2.2.1
[14] Apache は、 1.3 の頃から内容折衝に対応しています。 2000年代初め頃には拡張子のない URL が流行しましたが、 Apache でそれを実現する手法の一つとしてもよく用いられました。
[13] Accept-Language:
を用いた言語に関する内容折衝
(proactive negotiation) は、多言語対応した Webアプリケーションを中心に、
しばしば使われています。
[15] その他の内容折衝は、実装されていることも少なくありませんが、
事実上ほとんど使われていません。 Accept-Encoding:
による内容符号化に関する内容折衝は、
ほとんどのクライアントが標準的な内容符号化すべてに対応していて、
それ以外の内容符号化が使われることはほとんどないため、
事実上意味をなしていません。 Accept:
によるMIME型に関する内容折衝は、異なる形式の同じ内容のデータを同じ
URL で提供するのが便利なことがほとんどないため、あまり使われていません。
[16] >>12 の定義によれば User-Agent:
の値に基づく応答の文書の使い分けも内容折衝の一種ということになり、
これは多くの Webアプリケーションで行われていますが、
技術的には HTTP の提供する仕組みとの関連性が薄いものです。
[17] レンダリングされる装置や利用方法による違いは、内容折衝ではなく、 別の URL によって提供されるのが一般的です。例えば、通常の HTML と印刷用の PDF を別の URL で提供したり、通常の HTML と携帯電話向けの HTML を別のドメインで提供したり、 ダウンロード提供する画像をサイズにより別のファイル名としたりが普通であり、 技術的には内容折衝を用いていません。 10年代になってからはレスポンシブデザインにより、単一の HTML でデスクトップ向けとスマートフォン向けの内容を提供するのが一般的になってきていますが、 やはりこれも HTTP の内容折衝とは異なるものです。 (>>12 の分類によれば条件付き内容に当てはまるでしょうが、 HTTP とは関係ない話です。)
[18] 内容折衝によって HTTP の仕様上の資源や表現の定義と概念が複雑になっていますし、 キャッシュの実装も複雑化しています。内容折衝は一見便利な機能ですが、 >>15 の通り現在ではあまり使われなくなっていますし、 本当に必要だったのかは大変怪しいところです。 (今更削除するのも困難ですが...)
[6] アイデアのメモ。
問題: 日本語版と英語版がある Webサイトで、
リンクはすべて折衝が行われる URI
を使って記述されている。 Accept-Language
で日本語を最優先にしていると、通常は日本語版が
Webブラウザに表示されるが、敢えて英語版が見たく、
Web頁 A.ja 内のリンクを使って
A.en に移動する。ここで、更に
A.en 内のリンクから B
に移動すると、日本語版が表示されてしまうのだが、
英語版の方が自然ではないか。
(あくまで例であり、言語以外に媒体型その他でもいい。
日本語も英語も Accept-Language
に入っていない場合というシナリオも興味深い。)
すぐ思いつく対策: A.en 内のリンク先 URI は B ではなく B.en にすればよい。
すぐ思いつく対策の問題:
解:
Webブラウザを修正する。
rel=alternate
その他代替版への移動であることが明確な方法で頁遷移が行われた後は、
そのリンクの情報 (例: hreflang
)
やリンク先の実体に付された情報
(例: Content-Language
)
を内容折衝で優先的に使う
(Accept-Language
で最優先にする)。
最優先にする対象範囲は、鯖全体か、 URI
path
の階層によって決定する。
解の既知の問題:
解の REST consideration: 認証と同じように、利用者にはセッションに見えるかもしれないが実際にはセッションではない。
解の security consideration: 利用者の操作によって生成された内容折衝のための情報を鯖に送信することになるが、 privacy 上問題となるほど繊細なものではないと思われる。
(名無しさん)
[7] コンテントネゴシエーション - Apache HTTP サーバ http://httpd.apache.org/docs/2.0/ja/content-negotiation.html (名無しさん)
[8] HTTP Content Negotiation and Mixed-Namespace Documents Requirements ( 版) http://damowmow.com/temp/http-conneg-cdi-req.xhtml
[11] 279729 – Notify user agent of xforms "capabilities" ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=279729
[407] Hixie's Natural Log: Content negotiation in heterogenous XML environments ( ( 版)) http://ln.hixie.ch/?start=1036767231&count=1
[39] Why not conneg - WHATWG Wiki ( 版) https://wiki.whatwg.org/wiki/Why_not_conneg
[40] ietf-http-negotiation-scenarios-00.txt ( 版) http://ietfreport.isoc.org/idref/draft-ietf-http-negotiation-scenarios/
[44] draft-ietf-http-negotiate-scenario-02 - Scenarios for the Delivery of Negotiated Content () https://tools.ietf.org/html/draft-ietf-http-negotiate-scenario-02