HTTPヘッダーでは大文字と小文字が区別されますか?


713

ブログ投稿では、次のPHPを使用して応答のコンテンツタイプを設定しています。

header('content-type: application/json; charset=utf-8');

私はちょうどそれcontent-typeが大文字にされる必要があると言っているその投稿に関するコメントを得た、Content-type。これは正しいです?私はすべて小文字でうまくいくようで、HTTPヘッダーでは大文字と小文字が区別されないと想定しました。それとも、ブラウザが優れているからといって機能するのでしょうか。


26
大文字と小文字は区別されませんが、ケースを修正する場合は、「Content-Type」にする必要があります。
mc0e

10
FWIW、application / jsonで「charset」を送信しても意味がありません。そのようなパラメーターはありません。
Julian Reschke

5
@JulianReschke-falseです。charsetはContent-Typeヘッダー内の有効なパラメーターです。w3.org/International/articles/http-charset/indexおよびdeveloper.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlainを

8
@NullUserException-欠点(バイトの浪費を除く)は、charsetパラメータについて人々を混乱させ続けることです。代わりにそれらのコンポーネントを修正してください。
Julian Reschke 16年

10
@JulianReschkeは正しいです。IANAアプリケーション/ JSONの割り当ては、文字セットがこのメディアタイプのために無意味であると言います。何もしません。不要な混乱の原因となるノイズなので、追加しないでください。
モニカ2331977を2017

回答:


934

ヘッダー名では大文字と小文字が区別されません。

RFC 2616から-「ハイパーテキスト転送プロトコル-HTTP / 1.1」セクション4.2、「メッセージヘッダー」

各ヘッダーフィールドは、名前とそれに続くコロン( ":")およびフィールド値で構成されます。フィールド名は大文字小文字が区別されます。

更新中のRFC 7230には、この部分のRFC 2616からの変更はリストされていません。


96
RFC 7230では、「各ヘッダーフィールドは、大文字と小文字を区別しないフィールド名と、その後に続くコロン( ":")、オプションの先頭の空白、フィールド値、およびオプションの末尾の空白で構成されます。」
マーティン・ミュラー

6
PHPで 'apache_request_headers()'メソッドを使用してヘッダーフィールドの値を取得する場合、ヘッダーフィールドでは大文字と小文字が区別されます。
2015年

7
この点で仕様に準拠していない人気のあるブラウザの例を誰かが提供できますか?
David W

7
@Harmこれは、PHPでの文字列比較で大文字と小文字が区別されるためです。
MrWhite 2016

7
見ている人のために、ここではRFC 7230がフィールドヘッダーは大文字と小文字を区別しないものとして扱われるべきであると明示的に述べているところです:tools.ietf.org/html/rfc7230#section-3.2
JZ

238

RFC 2616によると、HTTPヘッダー名は大文字と小文字が区別されません。

4.2:

各ヘッダーフィールドは、名前とそれに続くコロン( ":")およびフィールド値で構成されます。フィールド名は大文字と小文字を区別しません。

(フィールド値では大文字と小文字が区別される場合とされない場合があります。)

主要なブラウザがこれを順守することを信頼していれば、準備は万端です。


ところで、ほとんどのHTTPとは異なり、メソッド(動詞)大文字と小文字を区別します。

5.1.1メソッド

Methodトークンは
、Request-URIで識別されるリソースで実行されるメソッドを示します。このメソッドでは大文字と小文字が区別されます。

   Method         = "OPTIONS"                ; Section 9.2
                  | "GET"                    ; Section 9.3
                  | "HEAD"                   ; Section 9.4
                  | "POST"                   ; Section 9.5
                  | "PUT"                    ; Section 9.6
                  | "DELETE"                 ; Section 9.7
                  | "TRACE"                  ; Section 9.8
                  | "CONNECT"                ; Section 9.9
                  | extension-method
   extension-method = token

別のコメントは、この答えは時代遅れであると述べました。本当?もしそうなら、多分あなたはそれを更新して、人々が混乱しないようにすることができます。
スピードプレーン2016年

36

tldr; HTTP / 1.1ヘッダーとHTTP / 2ヘッダーはどちらも大文字と小文字を区別しません。

RFC 7230(HTTP / 1.1)によると:

各ヘッダーフィールドは、大文字と小文字を区別しないフィールド名と、その後に続くコロン( ":")、オプションの先頭の空白、フィールド値、およびオプションの末尾の空白で構成されます。

https://tools.ietf.org/html/rfc7230#section-3.2

また、RFC 7540(HTTP / 2):

HTTP / 1.xと同様に、ヘッダーフィールド名は
、大文字と小文字を区別しない方法で比較されるASCII 文字列です。

https://tools.ietf.org/html/rfc7540#section-8.1.2


19
明確にするだけです。フィールドは大文字と小文字を区別しません。フィールド名によっては、フィールドで大文字と小文字が区別される場合があります。
Julian Reschke 16

7
HTTP / 2 RFCからの引用:「ただし、ヘッダーフィールド名はHTTP / 2でエンコードする前に小文字に変換する必要があります。大文字のヘッダーフィールド名を含むリクエストまたはレスポンスは、不正な形式として処理する必要があります(8.1.2.6項)」
ボレクバーナード

2
「小文字に変換しなければならない...」の部分にも気づきました。何故ですか?CamelCaseは実際には好ましいケース(開発ツール、一般的なコードライブラリ)のようですが、なぜHTTP / 2はその傾向に逆行しようとするのでしょうか。
jimp 2017年

7
@jimp-標準は一貫性に関するものであるため-キャメルケースの使用は、特に略語、初期化、頭字語ではあいまいになる可能性があります。たとえば、「Front-End-Https」または「Front-End-HTTPS」です-「WWW-Authenticate」または「Www-Authenticate」-すべて小文字を指定すると、フィールドを標準化することであいまいさがなくなります。これにより、ヘッダー全体の処理が簡素化されます。
Fraser

16

header('Content-type: image/png') 画像ストリームがテキストとして表示されたため、IE11を提供するPHP 5.5では動作しませんでした

header('Content-Type: image/png') 画像のように機能し、画像として表示されます

違いは、大文字の「T」だけです。


18
次に、すべてのヘッダーフィールドが大文字と小文字を区別せずに読み取られることになっているため、実装には明らかに問題があります。Apache Benchもめちゃくちゃです。小文字のフィールド名は好きではありません。
債券

8

大文字と小文字は区別されません。実際、NodeJS Webサーバーは、リクエストオブジェクトで使用できるようにする前に、明示的に小文字に変換します。

ここで、クライアントが実際にヘッダーを送信した方法に関係なく、すべてのヘッダーが小文字のみで表されることに注意することが重要です。これにより、あらゆる目的でヘッダーを解析するタスクが簡略化されます。


これは、node / javascriptが大文字と小文字を区別するためです。簡単にするために、すべてを小文字に正規化します。つまり、有効なHTTPヘッダーは大文字と小文字を区別しません。
Svish

4

HTTPのRFC(上記で引用)は、ヘッダーで大文字と小文字を区別しないことを指示していますが、特定のブラウザー(私はIEを見ています)では、各単語を大文字にするのが最善の傾向にあることがわかります。

Location: http://stackoverflow.com

Content-Type: text/plain

location: http://stackoverflow.com

content-type: text/plain

これは「HTTP」標準ではありませんが、開発者として私たちが考慮しなければならないブラウザのもう1つの奇妙なものです。


3
それについて何か証拠はありますか?
ジュリアンレシュケ2016年

3
具体的なテストケースを意味しました。私はテストするIEを持っています。
Julian Reschke、2016年

11
なぜそれが最も良い傾向があるのですか?
2016年


0

正式には、ヘッダーでは大文字と小文字が区別されませんが、すべての単語の最初の文字を大文字にするのが一般的です。
しかし、これは一般的な慣習であるため、IEのような特定のプログラムはヘッダーが大文字であると想定しています。
したがって、ドキュメントでは大文字と小文字は区別されないと言われていますが、悪いプログラマは基本的にドキュメントを変更しています。


-4

ヘッダーワードは大文字と小文字を区別しませんが、Content-Typeのように右側では、大文字と小文字が区別されるため、このように記述することをお勧めします。以下の私の例のように

headers = headers.set('Content-Type'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.