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/index 및 developer.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.