【こんてんつねごしえーしょん】

コンテンツネゴシエーション とは?

最終更新:
💡 同じURLでも、希望や対応形式に合わせて中身を選ぶ

同じリソースについて、言語・データ形式・圧縮方式などの異なる表現から、返すものを選ぶHTTPの仕組み。サーバーがリクエストヘッダーの希望を参考に選ぶ方式などがある。

📌 このページのポイント
同じURLの表現を、希望を参考に選ぶ ブラウザ 同じURLへ リクエスト サーバー 用意した表現 から選ぶ Accept-Language ja, en;q=0.8 日本語 English この例では日本語を選択 応答を表示 日本語版 Content-Language: ja Vary: Accept-Language キャッシュの再利用条件へ
日本語版と英語版を用意した例。Varyは選択に使ったリクエストヘッダーをキャッシュへ伝える。
ひよこ ひよこ
コンテンツネゴシエーションって、何を選ぶの?
ペンギン先生 ペンギン先生
同じリソースの日本語版と英語版、画像形式、圧縮方式などだよ。よく使う方式では、ブラウザがリクエストヘッダーで希望を伝え、サーバーが用意した表現の中から選ぶんだ。
ひよこ ひよこ
具体的にはどんなヘッダー?
ペンギン先生 ペンギン先生
AcceptはHTMLや画像などの形式、Accept-Languageは言語、Accept-EncodingはgzipやBrotliなどの圧縮方式を伝えるよ。たとえばAccept-Language: ja, en;q=0.8は、日本語を英語より強く希望する指定なんだ。
ひよこ ひよこ
ja, enと並べるだけでは、日本語優先にならないの?
ペンギン先生 ペンギン先生
q値を省略すると両方とも1だよ。同じq値の並び順を優先順位として扱う実装もあるけれど、その動作には頼れない。q値で差を付けても、サーバーが用意できる言語や選択方針に左右されるんだ。
ひよこ ひよこ
画像にも使えるの?
ペンギン先生 ペンギン先生
使えるよ。同じ画像のAVIF、WebP、PNGなどを用意しておき、Acceptで受け取れる形式を伝える。ヘッダーだけで画像を変換するわけではないので、サーバー側で用意や変換、選択の処理を実装するんだ。
ひよこ ひよこ
キャッシュには、何を伝えるの?
ペンギン先生 ペンギン先生
Accept-Languageで選んだなら、Vary: Accept-Languageでそのことを伝えるよ。HTTPキャッシュは、そのヘッダーが元のリクエストと一致するか確認して再利用を判断する。同じURLというだけで別の言語の応答を使い回さないためなんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コンテンツネゴシエーション」って出てきたら「同じリソースの言語や形式などを選ぶHTTPの仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Content Negotiation」 = コンテンツの交渉
💬 Negotiationは交渉。HTTPでは、同じリソースの異なる表現から返すものを選ぶ仕組みを指すよ。必ず何度も話し合う通信が必要という意味ではないんだ。

参考資料

← 用語集にもどる