メインコンテンツへ
短.be

コンテンツネゴシエーション

クライアントとサーバーが HTTP ヘッダーを通じて、最適なコンテンツ形式 (言語、フォーマット、エンコーディング) を交渉する仕組み。

2026年8月24日 · 約 2 分で読めます

リダイレクト

コンテンツネゴシエーション (Content Negotiation) とは、HTTP 通信においてクライアント (ブラウザ) とサーバーが、リクエストされたリソースの最適な表現形式を交渉する仕組みです。同じ URL に対して、ユーザーの言語設定、デバイス、対応フォーマットに応じて異なるコンテンツを返すことができます。

コンテンツネゴシエーションは主に HTTP リクエストヘッダーを通じて行われます。Accept ヘッダー (対応するメディアタイプ: text/html、application/json など)、Accept-Language ヘッダー (希望する言語: ja、en-US など)、Accept-Encoding ヘッダー (対応する圧縮方式: gzip、br など) が代表的です。いずれのヘッダーも値に q を添えて優先度を示せます。Accept-Encoding: br, gzip;q=0.8 は br を第一希望とし、非対応なら gzip でよいという意味になります。サーバーがこれらのヘッダーを見て応答を変える場合は、判断に使ったヘッダー名を Vary で返す必要があります。Vary: Accept-Language を付け忘れると、キャッシュCDN が最初に届いた言語の応答を後続の利用者にも配ってしまいます。

多言語サイトでのコンテンツネゴシエーションは、短縮 URL と密接に関わります。同じ短縮 URL をクリックしても、ユーザーのブラウザ言語設定に応じて日本語ページや英語ページにリダイレクトする実装が可能です。ただし、SEO の観点では、言語ごとに異なる URL を持ち、hreflang タグで関連付ける方が推奨されます。コンテンツネゴシエーションによる言語切り替えは、検索エンジンが各言語版を正しくインデックスできない場合があるためです。Google も、Cookie やブラウザ設定で表示を切り替えるのではなく言語版ごとに別の URL を用意する方法を案内しており、ある言語版から別の言語版へ自動的にリダイレクトすることは避けるよう求めています。自動リダイレクトは、利用者と検索エンジンの双方がすべての版に到達できなくなる原因になります。Google のクローラーはリクエストに Accept-Language を付けずに巡回するため、このヘッダーだけで表示を切り替えると既定の言語版しか読み取られません。IP アドレスから地域を推定して内容を変える方法も避けるよう案内されています。

API の設計でもコンテンツネゴシエーションは重要です。短縮 URL サービスの API が、Accept ヘッダーに応じて JSON または XML でレスポンスを返す実装は一般的です。同じリソースに対して複数の表現形式を用意しておくと、利用側は自分が扱える形式を選べます。ただし、どの表現を返すかを選ぶアルゴリズムは HTTP の仕様では定められておらず、サーバーの実装に委ねられています。要求された形式に対応できないときに 406 (Not Acceptable) を返すか、ヘッダーを無視して既定の形式を返すかも実装側の判断になります。

コンテンツネゴシエーションには、サーバー駆動型 (サーバーがリクエストヘッダーを見て判断) とエージェント駆動型 (サーバーが選択肢を提示し、クライアントが選択) の 2 種類があります。HTTP の仕様では前者を proactive negotiation、後者を reactive negotiation と呼びます。実際に使われるのは前者が中心ですが、ヘッダーからの推測が常にある程度は恣意的になるという弱点と引き換えです。後者が広まらなかったのは、選択肢を提示するページの形式が仕様で定められておらず選択を自動化できないことと、本来のリソースを取得するまでに往復が 1 回増えることが理由です。

X でシェアはてブ

この記事は役に立ちましたか?

関連用語

関連記事

よくある質問

コンテンツネゴシエーションで言語を自動切り替えすべきですか?
ユーザー体験としては便利ですが、SEO の観点では注意が必要です。検索エンジンが各言語版を正しくインデックスできない場合があるため、言語ごとに異なる URL を持ち、hreflang タグで関連付ける方が推奨されます。加えて Accept-Language はブラウザやシステムの設定を反映しただけの値で、その利用者が今読みたい言語を必ず示すとは限りません。自動判定を使うならサイトの入口ページに限り、表示された言語を利用者自身が切り替えられる手段を必ず併せて用意します。
API でコンテンツネゴシエーションを実装するには?
リクエストの Accept ヘッダーを解析し、application/json なら JSON、application/xml なら XML でレスポンスを返します。対応していないフォーマットが要求された場合の扱いは 1 つに決まっておらず、HTTP 406 (Not Acceptable) を返す方法と、ヘッダーを無視して既定の形式を返す方法のどちらも仕様上は許されます。利用側にとっては何らかの応答が返る方が扱いやすいため、既定形式を返す実装も少なくありません。判断に使ったヘッダーは Vary: Accept として応答に含めます。
Accept-Language ヘッダーはどのように設定されますか?
ブラウザの言語設定に基づいて自動的に送信されます。たとえば日本語環境のブラウザは「Accept-Language: ja,en-US;q=0.9,en;q=0.8」のように、優先度付きで複数の言語を送信します。

知識を、実際のリンクで。

無料で URL を短縮する