Ne zaman birini diğerine ve neden kullanarak düşünün?
HTTP_HOST
HTTP request header elde edilmiş ve bu, aslında müşteri isteği "hedef ana" olarak kullanılan ne olduğunu. SERVER_NAME
sunucu geneli tanımlanır. Hangi kullanım için bir Sizin için ihtiyacınız ne bağlıdır. Şimdi ancak bir nedenle iş mantığı kullanılmak üzere güvenilir ve diğer daha güvenilir bir sunucu kontrollü değeri olmayabilir bir istemci-kontrollü bir değer olduğunu farkına varmalıdır. Ancak söz webserver SERVER_NAME
doğru yapılandırılmış olduğundan emin olmanız gerekir. Bir örnek olarak, Apache httpd'nin alarak, buradan bir özü var its documentation:
Bir ServerName belirtilmemişse, daha sonra sunucu IP adresi üzerinde bir ters arama yaparak hostname anlamak için çalışır. Hiçbir liman ServerName belirtilirse, daha sonra sunucu gelen isteği portu kullanacaktır. Optimum güvenilirlik ve öngörülebilirlik için, ServerName yönergesini kullanarak açıkça bir konak ismi ve port belirtmektir.
Update: bobince's answer PHP her zaman için değer döndürür HTTP_HOST
's olacağı için bir bağlantı içeren soru üzerine Pekka cevabını kontrol ettikten sonra {[(3) }], önce birkaç yıl benim kendi PHP 4.x + Apache HTTPD 1.x tecrübelere karşı gider, ben (PHP 5.2.8 ile Apache HTTPD 2.2.1) Windows XP'de benim şimdiki XAMPP çevreden bazı toz patladı , bu başladı hem değerlerini yazdırır bir PHP sayfası oluşturduk, bana bu (yanlış) gerçekten böyle olduğunu URLConnection
to modify the Host
başlık ve testleri öğretti kullanarak bir Java test uygulaması yarattı.
İlk PHP şüphelenen ve konuyla ilgili bazı PHP bug reports kazma sonra, ne zaman {[(yanlış HTTP Host
başlık döndü, sorunun kökü kullanılan web sunucusu olduğunu öğrendim 2)]} istendi. Yani Apache HTTPD bug reports various keywords konuyla ilgili kullanarak içine kazılmış, ama bir tane bulmak için görünmüyor olabilir.
Biz bu konu ile ilgili HTTPD için bir bug rapor gerekiyor değil mi? Bu, ilgili PHP hata raporlarında defalarca önerdi rağmen kimsenin önce yapmış gibi görünüyorsun.
Update 2: Ben Linux kullanıldığında belgelenmiş olarak çalışmak gibi görünüyor, çünkü hata, Windows Apache HTTPD için phpX_module
özel olarak aslında daha fazla olduğunu düşünüyorum. Ben sadece gevşek PHP modülleri için dev, belge oluş ve hata sitenizi bulmak için nerede bilmiyorum? Strike>
Update 3: Sonunda Apache HTTPD hata veritabanından bir related bug bulundu. Bu davranış etrafında Apache HTTPD 1.3 beri tanıtıldı. Eğer) httpd.conf
(ayrıca {[(6 altındaki uyarı kontrol olarak <VirtualHost>
girdisinde UseCanonicalName
directive to on
ayarlamak gerekir ]}!).
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
Bu benim için çalıştı.
Özetlenmiş, SERVER_NAME
daha güvenilir olduğunu, ancak dependent sunucu geneli konum!
HTTP_HOST
istemci tarafından gönderilen hedef ev sahipliği yapmaktadır. Bu, kullanıcı tarafından serbestçe kontrol edilebilir. Bu www.stackoverflow.com
bir HTTP_HOST
değeri soran sitenize bir istek göndermek için sorun yok.
SERVER_NAME
sunucunun VirtualHost
tanımı gelmektedir ve bu nedenle daha güvenilir olarak kabul edilir. Ancak, aynı zamanda web sunucusu kurmak nasıl ilgili belli şartlar altında dışarıdan manipüle edilebilir: Her iki varyasyon güvenlik yönleri ile fırsatlar This SO question a> bu bakın.
Güvende olmak ya güvenmemelisiniz. Bu gerçekten ne yapmak istediğinize bağlıdır kullanmak ne dedi. Eğer komut dosyası üzerinde çalışmakta olduğu etki alanı belirlemek istiyorsanız, güvenli bir şekilde sürece kötü niyetli bir kullanıcı gelen geçersiz değerler hiçbir şey kıramaz HTTP_HOST
kullanabilirsiniz.
I this answer belirtildiği gibi sunucu 80 dışında bir bağlantı noktasında çalışıyorsa iken {[((bir geliştirme / intranet makinede ortak olabilir gibi) daha sonra HTTP_HOST
, bağlantı noktası içerir 2)]} yok.
$_SERVER['HTTP_HOST'] == 'localhost:8080'
$_SERVER['SERVER_NAME'] == 'localhost'
(En azından ben Apache port tabanlı VirtualHosts fark buydu)
HTTP_HOST
not :443
(ben test değil standart olmayan bir port üzerinde çalışan sürece) HTTPS üzerinden çalışırken içermiyor kaydetti.
Eğer IPv6 kullanmak istiyorsanız, muhtemelen HTTP_HOST yerine SERVER_NAME kullanmak istediğiniz unutmayın. Eğer http:// girerseniz [:: 1] / ortam değişkenleri aşağıdaki gibi olacaktır:
HTTP_HOST = [::1]
SERVER_NAME = ::1
Bu, örneğin bir mod_rewrite'ın yaparsanız, kötü bir sonuç alabilirsiniz anlamına geliyor. Bir SSL için örnek yönlendirme:
# SERVER_NAME will NOT work - Redirection to https://::1/
RewriteRule .* https://%{SERVER_NAME}/
# HTTP_HOST will work - Redirection to https://[::1]/
RewriteRule .* https://%{HTTP_HOST}/
Eğer bir konak olmadan sunucuya erişim Bu SADECE geçerlidir.
Bu SERVER_NAME kasıt insanlar daha güvenilir olduğunu anlamak için biraz zaman aldı. Paylaşılan bir sunucu kullanmak ve sanal konak direktifleri erişimi yok. Yani, farklı dizinlere farklı HTTP_HOSTs haritasına. Htaccess olarak mod_rewrite kullanmak. Bu durumda, bu anlamlı HTTP_HOST olduğunu. Bir isme dayalı sanal konaklar kullanıyorsa durum benzer: Bir sanal konağın içinde server_name yönergesi sadece HTTP_HOST bu sanal konağa eşleştirilir edilecektir diyor. Alt satırda her iki durumda da, aslında HTTP_HOST denir istemci, tarafından sağlanan "sunucu adı" kendisi bir dizin eşleştirilir sunucusu, içinde bir isim ile uyumlu olmalıdır, olmasıdır. Haritalama sanal konak direktifleri ile veya htaccess mod_rewrite kuralları ile yapılır olsun burada ikincildir. Her iki durumda da, HTTP_HOST SERVER_NAME olmalıdır. Apache bu şekilde yapılandırılmış olduğunu sevindim. Ancak, durum IP tabanlı sanal bilgisayarlar ile farklıdır. Şimdi müşteri adıyla, IP tarafından sunucu değil seçer, çünkü bu durumda sadece bu durumda, SERVER_NAME ve HTTP_HOST, farklı olabilir. Gerçekten de, bu önemli özel yapılandırmalar olabilir. Yani, şimdi başlayarak, benim kod bu özel konfigürasyonlarda taşıdık sadece durumda, SERVER_NAME kullanacağız.