HTTP 헤더는 대소 문자를 구분합니까?


712

블로그 게시물에서 다음 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-즉, 문자 집합은 Content-Type 헤더 내에서 유효한 매개 변수입니다. 참조 w3.org/International/articles/http-charset/indexdeveloper.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain

8
@NullUserException-단점 (바이트 낭비 제외)은 문자 세트 매개 변수에 대해 사람들을 계속 혼란스럽게하는 것입니다. 대신 해당 구성 요소를 고정하십시오.
Julian Reschke

10
@JulianReschke가 정확합니다. IANA 응용 프로그램 / JSON 할당은 캐릭터 셋이 미디어 유형에 대한 의미가 말했다. 아무것도하지 않습니다. 불필요한 혼동을 유발하는 소음이기 때문에 추가하지 마십시오.
복원 Monica Monica 2331977

답변:


934

헤더 이름은 대소 문자를 구분하지 않습니다.

에서 RFC 2616 - "하이퍼 텍스트 전송 프로토콜 - HTTP / 1.1" , 4.2 절, "메시지 헤더" :

각 헤더 필드는 이름과 콜론 ( ":") 및 필드 값으로 구성됩니다. 필드 이름은 대소 문자 구분합니다.

업데이트 RFC 7230 은이 부분 에서 RFC 2616의 변경 사항을 나열하지 않습니다 .


96
RFC 7230은 "각 헤더 필드는 대소 문자를 구분하지 않는 필드 이름 뒤에 콜론 (": "), 선택적 선행 공백, 필드 값 및 선택적 후행 공백으로 구성됩니다."
Martin Müller

6
헤더 필드는 PHP를 사용하여 'apache_request_headers ()'메소드를 사용하여 헤더 필드의 값을 가져올 때 대소 문자를 구분합니다.
Harm

7
누구든지 이와 관련하여 사양을 준수하지 않는 인기있는 브라우저의 예를 제공 할 수 있습니까?
David W

7
@Harm PHP의 문자열 비교는 대소 문자를 구분하기 때문입니다.
MrWhite

7
보고있는 사람이라면 RFC 7230에서 필드 헤더를 대소 문자를 구분하지 않는 것으로 명시해야합니다. tools.ietf.org/html/rfc7230#section-3.2
JZ

238

RFC 2616 에 따르면 HTTP 헤더 이름은 대소 문자를 구분하지 않습니다 .

4.2 :

각 헤더 필드는 이름과 콜론 ( ":") 및 필드 값으로 구성됩니다. 필드 이름은 대소 문자를 구분하지 않습니다.

필드 은 대소 문자를 구분하거나 구분하지 않을 수 있습니다.

주요 브라우저가이를 준수한다고 믿으면 모든 준비가 된 것입니다.


BTW는 대부분의 HTTP와 달리 메소드 (동사) 대소 문자를 구분합니다.

5.1.1 방법

메소드 토큰은
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

또 다른 의견자는이 답변이 더 이상 사용되지 않는다고 말했습니다. 그게 사실입니까? 그렇다면 사람들이 혼동하지 않도록 업데이트 할 수 있습니다.
speedplane

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

7
HTTP / 2 RFC에서 계속 인용 : "그러나 헤더 필드 이름은 HTTP / 2로 인코딩하기 전에 소문자로 변환해야합니다. 대문자 헤더 필드 이름을 포함하는 요청 또는 응답은 형식이 잘못된 것으로 처리되어야합니다 (8.1.2.6 단원)
보렉 버나드

1
방금 "MUST가 소문자로 변환됩니다 ..."부분도 보았습니다. 왜 그런 겁니까? CamelCase는 실제로 선호하는 케이스 (개발자 도구, 널리 사용되는 코드 라이브러리) 인 것처럼 보이며, 왜 HTTP / 2가 그러한 추세에 어긋나려고합니까?
jimp

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 웹 서버 는 요청 오브젝트에서 사용 가능하게하기 전에 이를 명시 적 으로 소문자 로 변환 합니다.

클라이언트가 실제로 보낸 방법에 관계없이 모든 헤더는 소문자로만 표시된다는 점에 유의해야합니다. 이것은 어떤 목적 으로든 헤더를 파싱하는 작업을 단순화합니다.


노드 / 자바 스크립트는 대소 문자를 구분하기 때문에 모든 것을 소문자로 정규화하기 때문에 사실상 HTTP 헤더가 대소 문자를 구분하지 않습니다.
Svish

4

HTTP에 대한 RFC (위에서 인용)는 헤더가 대소 문자를 구분하지 않음을 나타내지 만 특정 브라우저 (IE를보고 있습니다)를 사용하면 각 단어를 대문자로 표시하는 것이 가장 좋습니다.

Location: http://stackoverflow.com

Content-Type: text/plain

vs

location: http://stackoverflow.com

content-type: text/plain

이것은 "HTTP"표준은 아니지만 개발자로서 우리가 생각해야 할 브라우저 단점 중 하나 일뿐입니다.


3
그것에 대한 증거를 제공해 주시겠습니까?
Julian Reschke

3
구체적인 테스트 사례를 의미했습니다. 테스트 할 IE가 있습니다.
Julian Reschke

11
왜 그것이 가장 좋은 경향이 있습니까?
Svish

나는 임의의 대문자를 사용하여 헤더를 전송하는 브라우저를 만들어 개발자와 조이는 것입니다
GideonMax

0

공식적으로 헤더는 대소 문자를 구분하지 않지만 모든 단어의 첫 글자를 대문자로 표기하는 것이 일반적입니다.
그러나 일반적인 관행이기 때문에 IE와 같은 특정 프로그램은 헤더가 대문자로 가정합니다.
문서가 대소 문자를 구분하지 않는다고 말하지만 나쁜 프로그래머는 기본적으로 문서를 변경했습니다.


-4

Headers 단어는 대소 문자를 구분하지 않지만 Content-Type과 같은 오른쪽에는 대소 문자를 구분하기 때문에 이런 식으로 쓰는 것이 좋습니다. 아래 내 예처럼

headers = headers.set('Content-Type'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.