Các tiêu đề HTTP có phân biệt chữ hoa chữ thường không?


713

Trong một bài đăng trên blog, tôi sử dụng PHP sau đây để đặt loại nội dung của phản hồi:

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

Tôi vừa nhận được một bình luận trên bài đăng đó nói rằng content-typecần phải viết hoa , Content-type. Điều này có đúng không? Nó dường như hoạt động với tôi với tất cả các chữ thường và tôi cho rằng các tiêu đề HTTP không phân biệt chữ hoa chữ thường. Hoặc nó chỉ hoạt động vì trình duyệt là tốt đẹp?


26
Trường hợp này không nhạy cảm, nhưng nếu bạn định khắc phục vụ việc, thì đó phải là 'Loại nội dung'.
mc0e

10
FWIW, gửi "bộ ký tự" với ứng dụng / json là vô nghĩa. Không có tham số như vậy.
Julian Reschke 2/12/2015

5
@JulianReschke - Đó là sai, bộ ký tự là một tham số hợp lệ trong tiêu đề Kiểu nội dung. Xem w3.org/International/articles/http-charset/indexdeveloper.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain

8
@NullUserException - nhược điểm (ngoài các byte bị lãng phí) là tiếp tục gây nhầm lẫn cho mọi người về bộ ký tự param. Thay vào đó chỉ cần sửa các thành phần đó.
Julian Reschke

10
@JulianReschke là chính xác. Việc gán ứng dụng / json của IANA cho biết bộ ký tự là vô nghĩa đối với loại phương tiện này. nó không làm gì cả Vui lòng không thêm nó, vì tiếng ồn dẫn đến sự nhầm lẫn không cần thiết.
Phục hồi Monica 2331977

Câu trả lời:


934

Tên tiêu đề không phân biệt chữ hoa chữ thường.

Từ RFC 2616 - "Giao thức truyền siêu văn bản - HTTP / 1.1" , Mục 4.2, "Tiêu đề thư" :

Mỗi trường tiêu đề bao gồm một tên theo sau là dấu hai chấm (":") và giá trị trường. Tên trường là đựng pin- trong nhạy cảm.

RFC 7230 cập nhật không liệt kê bất kỳ thay đổi nào từ RFC 2616 ở phần này.


96
Câu trả lời vẫn đúng, RFC 7230 tuyên bố: "Mỗi trường tiêu đề bao gồm tên trường không phân biệt chữ hoa chữ thường theo sau dấu hai chấm (": "), khoảng trắng hàng đầu tùy chọn, giá trị trường và khoảng trắng theo dõi tùy chọn."
Martin Müller

6
Các trường tiêu đề phân biệt chữ hoa chữ thường khi sử dụng PHP để lấy giá trị của trường tiêu đề bằng phương thức 'apache_Vquest_headers ()'.
hại

7
Bất cứ ai cũng có thể cung cấp các ví dụ về các trình duyệt phổ biến không tuân thủ thông số kỹ thuật về vấn đề này?
David W

7
@Harm Điều đó chỉ bởi vì so sánh chuỗi trong PHP là phân biệt chữ hoa chữ thường.
MrWhite

7
Đối với bất kỳ ai đang tìm kiếm, đây là nơi RFC 7230 tuyên bố rõ ràng rằng các tiêu đề trường nên được coi là không phân biệt chữ hoa chữ thường: tools.ietf.org/html/rfc7230#section-3.2
JZ

238

Tên tiêu đề HTTP không phân biệt chữ hoa chữ thường, theo RFC 2616 :

4.2:

Mỗi trường tiêu đề bao gồm một tên theo sau là dấu hai chấm (":") và giá trị trường. Tên trường không phân biệt chữ hoa chữ thường.

( Giá trị trường có thể hoặc không phân biệt chữ hoa chữ thường.)

Nếu bạn tin tưởng các trình duyệt chính tuân theo điều này, bạn đã hoàn tất.


BTW, không giống như hầu hết HTTP, các phương thức (động từ) phân biệt chữ hoa chữ thường:

Phương pháp 5.1.1

Mã thông báo Phương thức cho biết phương thức được thực hiện trên
tài nguyên được xác định bởi URI yêu cầu. Phương pháp này là trường hợp nhạy cảm.

   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

Một bình luận khác cho biết câu trả lời này đã lỗi thời. Điều đó có đúng không? Nếu vậy, có lẽ bạn có thể cập nhật nó để mọi người không bị nhầm lẫn.
siêu tốc

36

tldr; cả hai tiêu đề HTTP / 1.1 và HTTP / 2 đều không phân biệt chữ hoa chữ thường.

Theo RFC 7230 (HTTP / 1.1):

Mỗi trường tiêu đề bao gồm một tên trường không phân biệt chữ hoa chữ thường, theo sau là dấu hai chấm (":"), khoảng trắng hàng đầu tùy chọn, giá trị trường và khoảng trắng theo dõi tùy chọn.

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

Ngoài ra, RFC 7540 (HTTP / 2):

Cũng giống như trong HTTP / 1.x, tên trường tiêu đề là các chuỗi ký tự ASCII
được so sánh theo kiểu không phân biệt chữ hoa chữ thường.

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


19
chỉ cần làm rõ: tên trường không phân biệt chữ hoa chữ thường; giá trị trường có thể phân biệt chữ hoa chữ thường, tùy thuộc vào tên trường.
Julian Reschke

7
Trích dẫn tiếp tục từ HTTP / 2 RFC: "Tuy nhiên, tên trường tiêu đề PHẢI được chuyển đổi thành chữ thường trước khi mã hóa trong HTTP / 2. Yêu cầu hoặc phản hồi có chứa tên trường tiêu đề chữ hoa PHẢI được coi là không đúng (Mục 8.1.2.6)"
Borek Bernard

2
Tôi chỉ nhận thấy phần "PHẢI được chuyển đổi thành chữ thường ...". Tại sao vậy? CamelCase dường như được ưu tiên trong thực tế (công cụ dành cho nhà phát triển, thư viện mã phổ biến), vậy tại sao HTTP / 2 lại cố gắng đi ngược lại xu hướng đó?
dong dỏng

7
@jimp - bởi vì các tiêu chuẩn là về tính nhất quán - sử dụng vỏ lạc đà có thể không rõ ràng - đặc biệt là với các chữ viết tắt, chữ viết tắt và từ viết tắt. Ví dụ: sẽ là "Front-End-Https" hoặc "Front-End-HTTPS" - "WWW-xác thực" hoặc "Www-xác thực" - chỉ định tất cả chữ thường sẽ loại bỏ sự mơ hồ bằng cách tiêu chuẩn hóa trường. Điều này lần lượt đơn giản hóa việc xử lý các tiêu đề tất cả các vòng.
Fraser

16

header('Content-type: image/png') không hoạt động với PHP 5.5 phục vụ IE11, vì trong luồng hình ảnh được hiển thị dưới dạng văn bản

header('Content-Type: image/png') làm việc, như trong hình ảnh xuất hiện như một hình ảnh

Chỉ khác là thủ đô 'T'.


18
Sau đó, rõ ràng có một vấn đề với việc triển khai vì tất cả các trường tiêu đề được cho là đọc không phân biệt chữ hoa chữ thường. Apache Bench cũng bị rối tung. Nó không giống như tên trường viết thường.
trái phiếu

8

Họ không phải là trường hợp nhạy cảm. Trong thực tế, máy chủ web NodeJS chuyển đổi rõ ràng chúng thành chữ thường, trước khi làm cho chúng có sẵn trong đối tượng yêu cầu.

Điều quan trọng cần lưu ý ở đây là tất cả các tiêu đề chỉ được thể hiện bằng chữ thường, bất kể khách hàng thực sự đã gửi chúng như thế nào. Điều này đơn giản hóa nhiệm vụ phân tích cú pháp tiêu đề cho bất kỳ mục đích nào.


Đó là bởi vì nút / javascript phân biệt chữ hoa chữ thường, vì vậy để đơn giản hóa mọi thứ họ bình thường hóa mọi thứ thành chữ thường, nghĩa là các tiêu đề HTTP có hiệu lực không phân biệt chữ hoa chữ thường.
Svish

4

RFC cho HTTP (như được trích dẫn ở trên) cho rằng các tiêu đề không phân biệt chữ hoa chữ thường, tuy nhiên bạn sẽ thấy rằng với một số trình duyệt nhất định (tôi đang nhìn vào bạn, IE) viết hoa từng từ có xu hướng tốt nhất:

Location: http://stackoverflow.com

Content-Type: text/plain

đấu với

location: http://stackoverflow.com

content-type: text/plain

Đây không phải là tiêu chuẩn "HTTP", mà chỉ là một trong những điều kỳ quặc của trình duyệt, chúng tôi là nhà phát triển, phải suy nghĩ.


3
Bạn có thể cung cấp bất kỳ bằng chứng về điều đó?
Julian Reschke

3
Tôi có nghĩa là một trường hợp thử nghiệm cụ thể; Tôi có một IE để kiểm tra.
Julian Reschke

11
Tại sao chính xác nó có xu hướng tốt nhất?
Svish

Tôi sẽ tạo một trình duyệt gửi các tiêu đề với viết hoa ngẫu nhiên chỉ để bắt vít với các nhà phát triển
GideonMax

0

chính thức, các tiêu đề không phân biệt chữ hoa chữ thường, tuy nhiên, thông thường là viết hoa chữ cái đầu tiên của mỗi từ.
nhưng, vì đó là thông lệ, một số chương trình như IE cho rằng các tiêu đề được viết hoa.
Vì vậy, trong khi các tài liệu nói rằng trường hợp không nhạy cảm, các lập trình viên xấu về cơ bản đã thay đổi các tài liệu.


-4

từ Tiêu đề không phân biệt chữ hoa chữ thường, nhưng ở bên phải như Kiểu Nội dung, là cách thực hành tốt để viết theo cách này, vì trường hợp của nó rất nhạy cảm. như ví dụ của tôi dưới đây

headers = headers.set('Content-Type'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.