Apa perbedaan $ host dan $ http_host di Nginx

Jawaban:

217

$hostadalah variabel dari modul Core .

$ host

Variabel ini sama dengan Host baris di header permintaan atau nama server yang memproses permintaan jika header Host tidak tersedia.

Variabel ini mungkin memiliki nilai yang berbeda dari $ http_host dalam kasus-kasus seperti: 1) ketika header input Host tidak ada atau memiliki nilai kosong, $ host sama dengan nilai direktif server_name; 2) ketika nilai Host berisi nomor port, $ host tidak menyertakan nomor port itu. Nilai $ host selalu lebih kecil sejak 0.8.17.

$http_hostjuga merupakan variabel dari modul yang sama tetapi Anda tidak akan menemukannya dengan nama itu karena ia didefinisikan secara umum sebagai $http_HEADER( ref ).

$ http_HEADER

Nilai header permintaan HTTP HEADER saat dikonversi ke huruf kecil dan dengan 'tanda hubung' dikonversi ke 'garis bawah', misalnya $ http_user_agent, $ http_referer ...;


Meringkas:

  • $http_hostsama dengan selalu HTTP_HOSTheader permintaan.
  • $hostsama dengan $http_host, huruf kecil dan tanpa nomor port (jika ada), kecuali ketika HTTP_HOSTtidak ada atau nilai kosong . Dalam hal itu, $hostsama dengan nilai server_namedirektif server yang memproses permintaan.
Glarrain
sumber
57
$ host secara khusus adalah yang pertamaserver_name yang didefinisikan dalam blok server saat ini. jika Anda memiliki banyak server_names, hanya yang pertama yang akan muncul.
Jonathan Vanasco
4
Benar. Pada kenyataannya, ini cukup tipikal untuk didefinisikan: server_name example.com www.example.com;
glarrain
Anda dapat memiliki banyak server_namearahan juga. jika Anda memiliki regex di yang pertama, itu menjadi $host, dan segala macam hal buruk dapat terjadi selama aturan penulisan ulang.
Jonathan Vanasco
5
Apakah $server_namevariabel sama dengan nilai server_namedirektif atau nama server aktual yang dipilih jika ada beberapa server_namearahan?
CMCDragonkai
1
@ CMCDragonkai $server_nameselalu sama dengan nilai pertama yang ditentukan dengan direktif server_name. Misalnya, dengan server_name example.com one.example.com two.example.com;, $server_nameakan selalu menjadi "example.com", terlepas dari host mana yang telah ditentukan pengguna . Bahkan, jika Anda tidak memiliki default_server, host mungkin adalah sesuatu yang sangat berbeda (seperti example.org).
ATLief