ส่วนหัว HTTP เป็นกรณี ๆ หรือไม่?


713

ในโพสต์บล็อกฉันใช้ PHP ต่อไปนี้เพื่อตั้งค่าประเภทเนื้อหาของการตอบสนอง:

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

ฉันเพิ่งได้รับความคิดเห็นเกี่ยวกับการโพสต์ที่บอกว่าcontent-typeจะต้องเป็นตัวพิมพ์ใหญ่, Content-type. ถูกต้องหรือไม่ ดูเหมือนว่าจะทำงานกับฉันด้วยตัวพิมพ์เล็กทั้งหมดและฉันคิดว่าส่วนหัว HTTP นั้นไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก หรือมันทำงานเพียงเพราะเบราว์เซอร์ดี?


26
เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่ถ้าคุณจะแก้ไขตัวพิมพ์เล็กก็ควรเป็น 'ประเภทเนื้อหา'
mc0e

10
FWIW การส่ง "charset" ด้วย application / json นั้นไม่มีจุดหมาย ไม่มีพารามิเตอร์ดังกล่าว
Julian Reschke

5
@JulianReschke - นั่นเป็นเท็จชุดอักขระเป็นพารามิเตอร์ที่ถูกต้องภายในส่วนหัวของประเภทเนื้อหา ดู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 ถูกต้อง การกำหนดแอปพลิเคชัน / Ison ของ IANAกล่าวว่าชุดอักขระนั้นไม่มีความหมายสำหรับสื่อประเภทนี้ มันไม่ได้ทำอะไรเลย โปรดอย่าเพิ่มเพราะเสียงดังนำไปสู่ความสับสนที่ไม่จำเป็น
Reinstate Monica 2331977

คำตอบ:


934

ชื่อส่วนหัวไม่คำนึงถึงขนาดตัวพิมพ์

จากRFC 2616 - "Hypertext Transfer Protocol - HTTP / 1.1" , ส่วน 4.2, "ส่วนหัวของข้อความ" :

แต่ละฟิลด์ส่วนหัวประกอบด้วยชื่อตามด้วยโคลอน (":") และค่าฟิลด์ ชื่อฟิลด์เป็น CASE- ในความละเอียดอ่อน

การอัพเดต RFC 7230 ไม่ได้แสดงรายการการเปลี่ยนแปลงใด ๆจาก RFC 2616ในส่วนนี้


96
คำตอบยังคงเป็นจริงสถานะ RFC 7230: "แต่ละฟิลด์ส่วนหัวประกอบด้วยชื่อฟิลด์ที่ไม่คำนึงถึงขนาดตัวพิมพ์ตามด้วยเครื่องหมายโคลอน (": "), ช่องว่างนำหน้าตัวเลือกค่าฟิลด์และช่องว่างต่อท้ายเสริม"
Martin Müller

6
ฟิลด์ส่วนหัวคำนึงถึงขนาดตัวพิมพ์เมื่อใช้ PHP เพื่อรับค่าของฟิลด์ส่วนหัวโดยใช้เมธอด 'apache_request_headers ()'
อันตราย

7
ทุกคนสามารถให้ตัวอย่างของเบราว์เซอร์ยอดนิยมที่ไม่เป็นไปตามข้อกำหนดในเรื่องนี้หรือไม่?
David W

7
@Harm นั่นเป็นเพียงเพราะการเปรียบเทียบสตริงใน PHP เป็นกรณี ๆ ไป
MrWhite

7
สำหรับผู้ที่กำลังมองหานี่คือที่ RFC 7230 ระบุอย่างชัดเจนว่าส่วนหัวของฟิลด์ควรได้รับการปฏิบัติตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: tools.ietf.org/html/rfc7230#section-3.2
JZ

238

ชื่อส่วนหัวของ HTTP เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตามRFC 2616 :

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)"
Borek Bernard

2
ฉันเพิ่งสังเกตเห็นว่า "ต้องแปลงเป็นตัวพิมพ์เล็ก ... " เช่นกัน ทำไมถึงเป็นอย่างนั้น? CamelCase ดูเหมือนจะเป็นที่ต้องการในทางปฏิบัติ (เครื่องมือสำหรับนักพัฒนา, ไลบรารี่โค้ดยอดนิยม), ดังนั้นทำไม HTTP / 2 จึงพยายามที่จะขัดกับเทรนด์นั้น?
jimp

7
@jimp - เนื่องจากมาตรฐานเกี่ยวกับความมั่นคง - การใช้อูฐกรณีสามารถคลุมเครือ - โดยเฉพาะอย่างยิ่งกับตัวย่อการเริ่มต้นและตัวย่อ ตัวอย่างเช่น - เป็น "Front-End-Https" หรือ "Front-End-HTTPS" - "WWW-Authenticate" หรือ "Www-Authenticate" - การระบุตัวพิมพ์เล็กทั้งหมดจะลบความกำกวมโดยสร้างมาตรฐานให้กับฟิลด์ สิ่งนี้จะช่วยลดความยุ่งยากในการจัดการส่วนหัวทุกรอบ
เฟรเซอร์

16

header('Content-type: image/png') ไม่ได้ทำงานกับ PHP 5.5 ที่ให้บริการ IE11 เช่นเดียวกับในสตรีมรูปภาพที่แสดงเป็นข้อความ

header('Content-Type: image/png') ทำงานเหมือนในภาพที่ปรากฏเป็นภาพ

ความแตกต่างเพียงอย่างเดียวคือทุน 'T'


18
เห็นได้ชัดว่ามีปัญหากับการใช้งานเนื่องจากฟิลด์ส่วนหัวทั้งหมดควรอ่านเป็นแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ Apache Bench ก็ยุ่งเหยิงเช่นกัน ไม่ชอบชื่อฟิลด์ตัวพิมพ์เล็ก
บอนด์

8

ไม่คำนึงถึงขนาดตัวพิมพ์ ในความเป็นจริงเว็บเซิร์ฟเวอร์ NodeJS แปลงให้เป็นตัวพิมพ์เล็กอย่างชัดเจนก่อนที่จะทำให้สามารถใช้งานได้ในวัตถุคำขอ

สิ่งสำคัญคือให้สังเกตที่นี่ว่าส่วนหัวทั้งหมดแสดงเป็นตัวพิมพ์เล็กเท่านั้นไม่ว่าลูกค้าจะส่งไปอย่างไร สิ่งนี้ช่วยให้งานง่ายขึ้นในการแยกส่วนหัวสำหรับวัตถุประสงค์อะไรก็ได้


นั่นเป็นเพราะโหนด / javascript คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ดังนั้นเพื่อทำให้สิ่งที่พวกเขาเป็นปกติเป็นเรื่องเล็กให้ง่ายขึ้นหมายความว่าส่วนหัว HTTP ที่มีผลนั้นไม่สำคัญ
Svish

4

RFC สำหรับ HTTP (ตามที่อ้างถึงด้านบน) กำหนดว่าส่วนหัวไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก แต่คุณจะพบว่ากับเบราว์เซอร์บางตัว (ฉันกำลังมองคุณ 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

ฉันจะสร้างเบราว์เซอร์ที่ส่งส่วนหัวด้วยการใช้อักษรตัวพิมพ์ใหญ่แบบสุ่มเพื่อควงกับ devs
GideonMax

0

อย่างเป็นทางการส่วนหัวเป็นตัวพิมพ์เล็กและตัวพิมพ์เล็ก แต่มันเป็นเรื่องธรรมดาที่จะใช้อักษรตัวแรกของทุกคำ
แต่เนื่องจากเป็นการปฏิบัติทั่วไปโปรแกรมบางโปรแกรมเช่น IE ถือว่าส่วนหัวเป็นตัวพิมพ์ใหญ่
ดังนั้นในขณะที่เอกสารบอกว่าไม่คำนึงถึงขนาดตัวพิมพ์ แต่โปรแกรมเมอร์ที่ไม่ดีก็เปลี่ยนเอกสารไปโดยทั่วไป


-4

คำส่วนหัวไม่คำนึงถึงขนาดตัวพิมพ์ แต่ทางด้านขวาเช่น Content-Type เป็นวิธีปฏิบัติที่ดีในการเขียนด้วยวิธีนี้เนื่องจากตัวพิมพ์เล็กและใหญ่ ชอบตัวอย่างของฉันด้านล่าง

headers = headers.set('Content-Type'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.