web-dev-qa-db-ja.com

AcceptおよびAccept-Charset-どちらが優れていますか?

HTTPでは、acceptヘッダーとapplication/xmlなどの値を使用して、クライアントが応答で特定のコンテンツを受け入れることができるようにリクエストで指定できます。コンテンツタイプの仕様では、charset=utf-8などのコンテンツタイプにパラメーターを含めることができます。これは、指定した文字セットのコンテンツを受け入れることができることを示します。

accept-charsetヘッダーもあります。これは、クライアントが受け入れる文字エンコードを指定します。

両方のヘッダーが指定されており、acceptヘッダーにcharsetパラメーターを持つコンテンツタイプが含まれている場合、サーバーは上位ヘッダーと見なしますか?

例えば。:

Accept: application/xml; q=1,
        text/plain; charset=ISO-8859-1; q=0.8
Accept-Charset: UTF-8

Fiddlerを使用してさまざまなサーバーにいくつかのサンプルリクエストを送信し、それらの応答方法をテストしました。

W

リクエスト

GET http://www.w3.org/ HTTP/1.1
Host: www.w3.org
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

応答

Content-Type: text/html; charset=utf-8

Google

リクエスト

GET http://www.google.co.uk/ HTTP/1.1
Host: www.google.co.uk
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

応答

Content-Type: text/html; charset=ISO-8859-1

StackOverflow

リクエスト

GET http://stackoverflow.com/ HTTP/1.1
Host: stackoverflow.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

応答

Content-Type: text/html; charset=utf-8

Microsoft

リクエスト

GET http://www.Microsoft.com/ HTTP/1.1
Host: www.Microsoft.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

応答

Content-Type: text/html

予想される動作が何であるかについて、コンセンサスは得られていないようです。私は驚いて見えるようにしています。

43
Paul Turner

Acceptヘッダーにメディアタイプを設定できますが、そのメディアタイプのcharsetパラメーター定義は RFC 2616 で定義されていません(ただし、禁止されていませんが、 )。

したがって、HTTP 1.1準拠のサーバーを実装する場合、最初にAccept-charsetヘッダーをクリックし、Acceptヘッダーで独自のパラメーターを検索します。

34
Paulo

読み取り RFC 2616 セクション14.1および14.2 Acceptヘッダーでは、charsetを指定できません。代わりにAccept-Charsetヘッダーを使用する必要があります。

12
Remy Lebeau

まず、Acceptヘッダーはパラメーターを受け入れることができます。 https://tools.ietf.org/html/rfc7231#section-5.3.2 を参照してください

すべてのtext/* mime-typesはcharsetパラメーターを受け入れることができます。 http://www.iana.org/assignments/media-types/media-types.xhtml#text

Accept-Charsetヘッダーにより、ユーザーエージェントはサポートする文字セットを指定できます。

Accept-Charsetヘッダーが存在しない場合、ユーザーエージェントは、eachtext/*に対してeachcharsetパラメーターを指定する必要があります受け入れられたメディアタイプ、例えば.

Accept: text/html;charset=US-ASCII, text/html;charset=UTF-8, text/plain;charset=US-ASCII, text/plain;charset=UTF-8

5
Malcolm Sparks

RFC 7231セクション5.3.2(Accept は次のように明確に述べています:

各メディア範囲の後には、0個以上の適用可能なメディアタイプパラメータ(例:charset)が続く場合があります

したがって、各content-typeのcharsetパラメーターが許可されます。理論的には、クライアントは、たとえばtext/htmlのみUTF-8およびtext/plainのみUS-ASCII

しかし、通常は、可能な文字セットを Accept-Charset header これは、Acceptヘッダーに記載されているすべてのタイプに適用されます。

これらのヘッダーの文字セットが重複しない場合、サーバーはステータスを送信できます 406 Not Acceptable

ただし、さまざまな理由でサーバーからの素晴らしいクロスマッチは期待していません。実際にはクライアントが まれに このようなリクエストを送信する一方で、サーバーコードがより複雑になり(したがって、よりエラーが発生しやすくなります)。また、最近では、サーバー側がすべてUTF-8を使用してそのまま送信されることを期待しているため、交渉の余地はありません。

2
Martin