Apakah HTTP header case-sensitive?

713

Dalam posting blog saya menggunakan PHP berikut untuk mengatur tipe konten dari respons:

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

Saya baru saja mendapat komentar di pos itu yang mengatakan bahwa huruf content-typekapital perlu dikapitalisasi Content-type,. Apakah ini benar? Tampaknya bekerja untuk saya dengan semua huruf kecil, dan saya menganggap header HTTP tidak peka huruf besar-kecil. Atau apakah itu hanya berfungsi karena browser itu bagus?

Svish
sumber
26
Ini case-sensitive, tetapi jika Anda akan memperbaiki case, itu harus 'Content-Type'.
mc0e
10
FWIW, mengirim "charset" dengan aplikasi / json tidak ada gunanya. Tidak ada parameter seperti itu.
Julian Reschke
5
@JulianReschke - Itu salah, charset adalah parameter yang valid di dalam header Tipe-Konten. Lihat w3.org/International/articles/http-charset/index dan developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain
8
@NullUserException - downside (selain dari byte yang terbuang) adalah untuk terus membingungkan orang tentang parameter charset. Sebagai gantinya, perbaiki komponen-komponen itu.
Julian Reschke
10
@JulianReschke benar. The IANA aplikasi / json tugas mengatakan charset ada artinya untuk jenis media ini. itu tidak melakukan apa-apa. Tolong jangan menambahkannya, karena kebisingan yang menyebabkan kebingungan yang tidak perlu.
Reinstate Monica 2331977

Jawaban:

934

Nama judul tidak peka huruf besar-kecil.

Dari RFC 2616 - "Protokol Transfer Hiperteks - HTTP / 1.1" , Bagian 4.2, "Header Pesan" :

Setiap bidang tajuk terdiri dari nama yang diikuti oleh titik dua (":") dan nilai bidang. Nama bidang bersifat case- in sensitive.

Memperbarui RFC 7230 tidak mencantumkan perubahan apa pun dari RFC 2616 di bagian ini.

Ignacio Vazquez-Abrams
sumber
96
Jawabannya masih benar, RFC 7230 menyatakan: "Setiap bidang tajuk terdiri dari nama bidang tidak peka huruf besar kecil diikuti oleh titik dua (": "), spasi spasial terkemuka opsional, nilai bidang, dan spasi spasi tambahan opsional."
Martin Müller
6
Bidang header peka huruf besar-kecil ketika menggunakan PHP untuk mendapatkan nilai bidang header menggunakan metode 'apache_request_headers ()'.
Bahaya
7
Adakah yang bisa memberikan contoh browser populer yang tidak mematuhi spesifikasi dalam hal ini?
David W
7
@Harm Itu hanya karena perbandingan string di PHP peka huruf besar-kecil.
MrWhite
7
Bagi siapa pun yang mencari, di sinilah RFC 7230 secara eksplisit menyatakan bahwa header lapangan harus diperlakukan sebagai case-sensitive: tools.ietf.org/html/rfc7230#section-3.2
JZ
238

Nama header HTTP tidak peka huruf besar-kecil, menurut RFC 2616 :

4.2:

Setiap bidang tajuk terdiri dari nama yang diikuti oleh titik dua (":") dan nilai bidang. Nama bidang tidak peka huruf besar-kecil.

( Nilai bidang mungkin peka terhadap huruf besar-kecil.)

Jika Anda memercayai browser utama untuk mematuhinya, Anda sudah siap.


BTW, tidak seperti kebanyakan dari HTTP, metode (kata kerja) adalah case sensitive:

5.1.1 Metode

Token Metode menunjukkan metode yang akan dilakukan pada
sumber daya yang diidentifikasi oleh Request-URI. Metode ini peka terhadap huruf besar-kecil.

   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
Lightness Races di Orbit
sumber
Komentar lain mengatakan jawaban ini sudah usang. Benarkah? Jika demikian, mungkin Anda dapat memperbaruinya sehingga orang tidak bingung.
speedplane
36

tldr; HTTP / 1.1 dan HTTP / 2 header tidak peka huruf besar-kecil.

Menurut RFC 7230 (HTTP / 1.1):

Setiap bidang tajuk terdiri dari nama bidang tidak peka huruf besar kecil diikuti oleh titik dua (":"), spasi spasial terkemuka opsional, nilai bidang, dan spasi spasi tambahan opsional.

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

Juga, RFC 7540 (HTTP / 2):

Sama seperti pada HTTP / 1.x, nama bidang header
adalah rangkaian karakter ASCII yang dibandingkan dengan cara case-insensitive.

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

Afshin Mehrabani
sumber
19
hanya mengklarifikasi: nama bidang tidak peka terhadap huruf besar-kecil; nilai bidang bisa peka terhadap huruf besar-kecil, tergantung pada nama bidang.
Julian Reschke
7
Kutipan lanjutan dari HTTP / 2 RFC: "Namun, nama bidang tajuk HARUS dikonversi ke huruf kecil sebelum penyandiannya dalam HTTP / 2. Permintaan atau respons yang berisi nama bidang tajuk huruf besar HARUS diperlakukan sebagai cacat (Bagian 8.1.2.6)"
Borek Bernard
2
Saya hanya memperhatikan bagian "HARUS dikonversi menjadi huruf kecil ..." juga. Mengapa demikian? CamelCase tampaknya menjadi casing yang lebih disukai dalam praktiknya (alat pengembang, pustaka kode populer), jadi mengapa HTTP / 2 berupaya untuk melawan tren itu?
gendut
7
@ jimp - karena standarnya tentang konsistensi - menggunakan camel-case bisa ambigu - terutama dengan singkatan, inisialisasi dan akronim. Misalnya - apakah itu "Front-End-Https" atau "Front-End-HTTPS" - "WWW-Authenticate" atau "Www-Authenticate" - menentukan semua huruf kecil menghilangkan ambiguitas dengan menstandarisasi bidang. Ini pada gilirannya menyederhanakan penanganan header semua putaran.
Fraser
16

header('Content-type: image/png') tidak bekerja dengan PHP 5,5 melayani IE11, seperti dalam aliran gambar ditampilkan sebagai teks

header('Content-Type: image/png') bekerja, seperti pada gambar muncul sebagai gambar

Satu-satunya perbedaan adalah modal 'T'.

Rudiger W.
sumber
18
Kemudian jelas ada masalah dengan implementasi karena semua bidang header seharusnya dibaca sebagai case-insensitive. Apache Bench juga kacau. Tidak suka nama bidang huruf kecil.
obligasi
8

Mereka tidak peka terhadap huruf besar-kecil. Bahkan server web NodeJS secara eksplisit mengubahnya menjadi huruf kecil, sebelum membuatnya tersedia di objek permintaan.

Penting untuk dicatat di sini bahwa semua header diwakili dalam huruf kecil saja, terlepas dari bagaimana klien mengirimnya. Ini menyederhanakan tugas penguraian header untuk tujuan apa pun.

jayarjo
sumber
Itu karena simpul / javascript peka terhadap huruf besar-kecil, jadi untuk menyederhanakan hal-hal mereka menormalkan segalanya menjadi huruf kecil, artinya header HTTP yang berlaku tidak peka huruf besar-kecil.
Svish
4

RFC untuk HTTP (seperti dikutip di atas) menentukan bahwa header tidak peka terhadap huruf besar-kecil, namun Anda akan menemukan bahwa dengan browser tertentu (Saya sedang melihat Anda, IE) yang menggunakan huruf kapital untuk masing-masing kata cenderung menjadi yang terbaik:

Location: http://stackoverflow.com

Content-Type: text/plain

vs.

location: http://stackoverflow.com

content-type: text/plain

Ini bukan standar "HTTP", tetapi hanya salah satu dari kebiasaan browser yang aneh, kita sebagai pengembang, harus pikirkan.

Robert Lerner
sumber
3
Bisakah Anda memberikan bukti tentang itu?
Julian Reschke
3
Maksud saya test case konkret; Saya punya IE untuk diuji.
Julian Reschke
11
Mengapa tepatnya itu cenderung menjadi yang terbaik?
Svish
Saya akan membuat browser yang mengirim header dengan huruf besar acak hanya untuk mengacaukan devs
GideonMax
0

secara resmi, tajuk tidak peka terhadap huruf besar-kecil, namun merupakan praktik umum untuk menggunakan huruf besar pada setiap kata.
tetapi, karena ini adalah praktik umum, program tertentu seperti IE menganggap header dikapitalisasi.
jadi sementara dokumen mengatakan case case-sensitive, programmer buruk pada dasarnya mengubah dokumen.

GideonMax
sumber
-4

kata Header tidak peka huruf besar-kecil, tetapi di sebelah kanan seperti Tipe-Konten, merupakan praktik yang baik untuk menulisnya dengan cara ini, karena huruf besar-kecilnya peka. seperti contoh saya di bawah ini

headers = headers.set('Content-Type'
PPK
sumber