Nginx değişkenleri $ host, $ http_host ve $ server_name arasındaki fark nedir?


42

Üç Nginx değişkenler arasındaki fark nedir $host, $http_hostve $server_name?

Hangisini kullanmam gerektiğinden emin olmadığım bir yeniden yazma kuralım var:

location = /vb/showthread.php {
    # /vb/showthread.php?50271-What-s-happening&p=846039
    if ($arg_p) {
        return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
        }

Sadece 'yeniden yazma kuralında ___ değişken kullan' demediği aynı zamanda aralarındaki teorik farkları da açıklayan bir cevap arıyorum.


Ben bile belirtmek gerek yoktu sonradan fark $schemeve $host... return 301 /forum/index.php?posts/$arg_p/;cezası çalışır.
Jeff Widman

Çoğu tarayıcı yönlendirme sırasında göreceli URL ile çalışır, ancak standart ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Locationbaşlıkta mutlak URL gerektirir .
Cthulhu

Yanıtlar:


54

Neredeyse her zaman kullanmalısınız $host, çünkü kullanıcı aracısının nasıl davrandığına bakılmaksızın, diğer değişkenlerden birinin semantiğine özellikle ihtiyaç duymazsanız, mantıklı bir şeye sahip olmanız garanti olan tek kişidir.

Fark nginx belgelerinde açıklanmıştır :

  • $host "bu öncelik sırasına göre: istek satırından ana bilgisayar adı veya" Ana Bilgisayar "istek başlık alanından ana bilgisayar adı veya bir isteği karşılayan sunucu adı"
  • $http_host İstekte mevcutsa, HTTP "Ana Bilgisayar" başlık alanının içeriğini içerir
  • $server_nameiçeren server_namebu nginx yapılandırmada tarif edildiği gibi, talep işleme sanal konağın. Bir serverçoklu server_names içeriyorsa , sadece birincisi bu değişkende mevcut olacaktır.

Kullanıcı aracıları için bir host: host yerine istek satırında host adını göndermesi yasal olduğundan, proxy'lere bağlanma dışında nadiren yapılsa da bunu hesaba katmanız gerekir.

Ayrıca, kullanıcı aracısının bir ana bilgisayar adı gönderemediği durumu da hesaba katmalısınız, örneğin eski HTTP / 1.0 istekleri ve modern kötü yazılmış yazılımlar. Bunu, herhangi bir işe yaramayan, hepsini birden çok web sitesine hizmet ediyorsanız veya sunucunuzda yalnızca tek bir web sitesine sahipseniz, sunucunuzda yalnızca tek bir web sunucusuyla işlem yapabilirsiniz. . İkinci durumda, bunun için de hesaba katmanız gerekir.

Yalnızca $hostdeğişken, bir kullanıcı aracısının bir HTTP isteği oluştururken yapabileceği olası şeyleri oluşturur.


2
Öte yandan, UA'dan gelen alanın keyfi içerik içerdiği $server_namedurumlarda güvenlidir Host:.
Cthulhu

1
$ Http_host $ hostname olarak değiştirildi mi? Nginx doc'da bu değişkenleri bulamıyorum. $ hostname, sanırım en benzer olanıdır.
darkbaby123

3
@ darkbaby123 Hayır, hiçbir şey olarak değiştirilmedi. Belgelere bakınız .
Michael Hampton

1
Ah, şimdi http_ <name> değişkeninin ne anlama geldiğini anlıyorum. Teşekkür ederim!
darkbaby123

0

Kabul edilen cevapta belirtilmeyen önemli bir noktayı daha eklemek istiyorum.

$hostdo DEĞİL iken, liman numarasına sahip $http_hostDO port numarasını içerir.

düzenleme : her zaman değil.

"Add_header Y-blog-http_host" $ http_host "her zaman;"

O zaman curl -I -L domain.com:80(veya 443) ve başlık hiç bir port numarası göstermez. Nginx-extra 1.10.3 ile doğrulandı. Bunun nedeni yaygın http (s) bağlantı noktaları mı yoksa nginx yapılandırması mı? Bu yorum sadece bir şeylerin her zaman düşündüğünüz gibi davranmadığını söyler .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.