Apa itu header host http?

121

Mengingat bahwa koneksi TCP sudah dibuat ketika permintaan HTTP dikirim, alamat IP dan port secara implisit diketahui - koneksi TCP adalah IP + Port. Jadi, mengapa kita membutuhkan Hostheader? Apakah ini hanya diperlukan untuk kasus di mana ada beberapa host yang dipetakan ke alamat IP yang tersirat dalam koneksi TCP?

VladimirLenin
sumber

Jawaban:

142

The hostheader menceritakan webserver yang virtual host untuk menggunakan (jika diatur). Anda bahkan dapat memiliki virtual host yang sama menggunakan beberapa alias (= domain dan wildcard-domain). Dalam kasus ini, Anda masih memiliki kemungkinan untuk membaca header tersebut secara manual di aplikasi web Anda jika Anda ingin memberikan perilaku yang berbeda berdasarkan domain berbeda yang dialamatkan. Hal ini dimungkinkan karena di server web Anda, Anda dapat (dan jika saya tidak salah, Anda harus) menyiapkan satu vhost untuk menjadi host default. Vhost default ini digunakan setiap kali hostheader tidak cocok dengan host virtual yang dikonfigurasi.

Artinya: Anda bisa melakukannya dengan benar, meskipun mengatakan "beberapa host" mungkin agak menyesatkan: Host (mesin yang dialamatkan) sama, yang benar-benar diselesaikan ke alamat IP adalah nama domain yang berbeda (termasuk subdomain) yang juga dirujuk sebagai nama host (tapi bukan host!).

Meskipun bukan bagian dari pertanyaan, fakta menarik: Spesifikasi ini menyebabkan masalah dengan SSL pada awalnya karena server web harus mengirimkan sertifikat yang sesuai dengan domain yang ditangani klien. Namun, untuk mengetahui sertifikat apa yang akan digunakan, server web harus mengetahui nama host yang dialamatkan sebelumnya. Tetapi karena klien mengirim informasi itu hanya melalui saluran terenkripsi (yang berarti: setelah sertifikat dikirim), server harus menganggap Anda menjelajahi host default. Itu berarti satu domain yang diamankan ssl per alamat IP / kombinasi port.

Ini telah diatasi dengan Indikasi Nama Server ; namun, hal itu sekali lagi merusak beberapa privasi, karena nama server sekarang ditransfer dalam teks biasa lagi, jadi setiap man-in-the-middle akan melihat nama host mana yang Anda coba sambungkan.

Meskipun server web akan mengetahui nama host dari Indikasi Nama Server, hosttajuknya tidak usang, karena informasi Indikasi Nama Server hanya digunakan dalam jabat tangan TLS. Dengan koneksi yang tidak aman, tidak ada Server Name Indication sama sekali, jadi hostheadernya masih valid (dan perlu).

Fakta menarik lainnya: Sebagian besar server web (jika tidak semua) menolak permintaan http Anda jika tidak berisi tepat satu hostheader, bahkan jika itu dapat dihilangkan karena hanya ada vhost default yang dikonfigurasi. Itu berarti informasi minimum yang diperlukan dalam permintaan http- (get-) adalah baris pertama yang berisi METHOD RESOURCEdan PROTOCOL VERSIONdan setidaknya host-header, seperti ini:

GET /someresource.html HTTP/1.1
Host: www.example.com

Dalam Dokumentasi MDN tentang Host-Header, mereka benar-benar mengucapkannya seperti ini:

Bidang header Host harus dikirim di semua pesan permintaan HTTP / 1.1. Kode status 400 (Permintaan Buruk) akan dikirim ke pesan permintaan HTTP / 1.1 apa pun yang tidak memiliki bidang header Host atau berisi lebih dari satu.

Seperti yang disebutkan oleh Darrel Miller, spesifikasi lengkapnya dapat ditemukan di RFC7230 .

Psi
sumber
jawaban yang bagus. Anda menulis "Ini dimungkinkan karena di server web Anda, Anda dapat (dan jika saya tidak salah, Anda harus) mengatur satu vhost untuk menjadi host default. Vhost default ini digunakan setiap kali header host tidak cocok dengan virtual yang dikonfigurasi. host. " Saya ingin memeriksa di RFC7230 tetapi tidak vhosthanya menemukan 3 kejadian dekat yang virtual hostartinya tidak dekat dengan frasa Anda dan 12 untuk defaultsebagian besar tentang port,
Alexei Martianov
about host only that: "Jika tidak, maka jika kolom header Host disediakan dengan nilai kolom yang tidak kosong, komponen otoritasnya sama dengan nilai kolom Host." - tidak IMHO sama. Bisakah Anda mengarahkan saya untuk menunjuk RFC tentang itu?
Alexei Martianov
sisi praktis: ke beberapa server saya mengirim POST dengan header host = nama domain dan mendapatkan 200 (ok), saya mengirim header host yang diubah dan mendapatkan 404 (tidak ditemukan). Apakah itu berarti server tidak by the bookdikonfigurasi dengan benar (sepenuhnya )?
Alexei Martianov
karena komentar tidak dapat diedit: kutipan di 2 hampir defaultkata ditemukan oleh pencarian,Otherwise, the authority component is assigned the default name configured for the server
Alexei Martianov
aneh. semua 3 kemunculan virtual hostditemukan oleh pencarian saya di tools.ietf.org/html/rfc7230 ada di Appendix A. HTTP Version History. Sepertinya pencarian Anda menemukan yang lain.
Alexei Martianov
30

Saya akan selalu merekomendasikan pergi ke sumber otoritatif ketika mencoba memahami arti dan tujuan header HTTP.

Kolom header "Host" dalam permintaan memberikan informasi host dan port
dari URI target, yang memungkinkan server asal untuk
membedakan sumber daya saat melayani permintaan untuk beberapa
nama host pada satu alamat IP.

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

Darrel Miller
sumber