2014-06-18 35 views
-1

ServerName在虛擬主機中設置,但是當我參考$_SERVER['SERVER_NAME']時,我得到了請求頭中設置的任何東西。

我正在玩弄欺騙它,無論我設置主機請求頭,這是什麼被填充在服務器變量。

我認爲它應該採取任何在虛擬主機和另一個變量如$_SERVER['HTTP_HOST']應具有請求標頭值。

如果虛擬主機工作不正常,而且不只是使用請求頭,我會期望設置一些虛擬值。

我應該看看有沒有任何apache配置設置?什麼可能導致這種情況發生在服務器上?

我想依靠$_SERVER['SERVER_NAME']的原因是爲了安全性和可靠性,所以用戶不能欺騙它,所以我們是在腳本編寫期間設置它並關閉它的人。

謝謝。

+0

什麼是您的HTTPd服務器? Nginx? Apache? –

+0

@KevinLabécotapache tagged。 OP,告訴我們你目前試過的東西 – kosmos

+0

@kmsdev哎呀...對不起。無論如何,我發佈了我的答案。 –

回答

1

是否有任何Apache的配置設置,我應該尋找到

我這意味着有實際的PHP documentation發現了一個有趣comment apache ServerName的值是確保UseCanonicalName apache目錄已打開。

在帶有ServerAlias指令的apache虛擬主機設置中使用$ _SERVER ['SERVER_NAME']變量時,一定要檢查UseCanonicalName apache指令。如果它是On,則此變量將始終具有apache ServerName值。如果它關閉,它將具有由瀏覽器發送的標題給出的值。

我不確定這是你要找的東西,但可能值得檢查。

編輯

(可能)更相關的問題:我發現someone誰遇到類似的問題,因爲你:

我使用變量$ _ SERVER [ 'SERVER_NAME']在函數內部[...]但是我們可以在調用函數check_servname()之前修改$ _SERVER ['SERVER_NAME']的值。我要尋找一個合適的服務器名稱不是可以調用check_servername之前已更改的服務器名稱:

一種解決方案是定義一個超全局變量(是啊...討厭,但...)權在啓動時無法修改,所以通過引用超全局變量,您可以確保獲得正確的值。

所以使用類似

define ('SERVER_NAME' , $_SERVER['SERVER_NAME']); 

權在開始的時候應該解決您的問題,通過引用SERVER_NAME而不是$_SERVER['SERVER_NAME']。試一試。

+0

UseCanonicalName是問題,它沒有在httpd.conf中正確設置,所以服務器名稱由請求變量填充。謝謝! – user3581488