2011-08-02 49 views
18

我有以下代碼:爲什麼ServerVariable [「REMOTE_ADDR」]返回服務器IP?

string ip = Request.ServerVariables["REMOTE_ADDR"]; 

其中,在測試環境中不返回用戶IP addrress,但是當我們部署網站到生產,該變量在應用程序託管的服務器的IP 。任何幫助?

+2

你期望它返回什麼?看到這個:http://stackoverflow.com/questions/3812166/difference-between-remote-host-and-remote-addr – Oded

+3

@Oded該stackoverflow答案被接受,並有一些upvotes,但仍然是錯誤的。 – mhenry1384

+0

相同的'HttpContext.Current.Request.ServerVariables [「REMOTE_ADDR」] .ToString();'和Request.UserHostAddress。ToString();' – Kiquenet

回答

23

我的猜測是中間有一個代理。使用HTTP_X_FORWARDED_FOR第一,如果這是空,然後用REMOTE_ADDR

MSDN article

雖然獲取僅僅是REMOTE_ADDR服務器變量應該是夠了,我發現資源網上說認爲,這樣的代碼也應該檢查HTTP_X_FORWARDED_FOR變量;如果請求通過轉換地址的代理服務器來傳遞,則它是包含正確地址的這個變量。如果您請求一個不存在的服務器變量,則ServerVariables屬性將返回一個空字符串。因此,即使此屬性未出現在我的測試中,嘗試檢索其值也不會導致麻煩。

UPDATE:

如果這是你必須擁有的設置改變了,你應該問,看看他們是否能有經過的始發IP負載平衡器。我知道這可以通過微軟的ISA服務器完成。

如果這不是一種選擇,還有這些其他的服務器變量,你可以試試,看看他們是否產生一個結果:

"HTTP_X_COMING_FROM" 
"HTTP_X_FORWARDED_FOR" 
"HTTP_X_FORWARDED" 
"HTTP_X_REAL_IP" 
"HTTP_VIA" 
"HTTP_COMING_FROM" 
"HTTP_FORWARDED_FOR" 
"HTTP_FORWARDED" 
"HTTP_FROM" 
"HTTP_PROXY_CONNECTION" 
"CLIENT_IP" 
"FORWARDED" 
+0

它的錯誤,因爲如果你有代理然後它總是發送你錯誤的IP地址 –

+0

@Bhargav Mistri - 我有類似的代碼運行在多個生產箱。我過去遇到過這種情況,可以向你保證這是由於代理問題。請記住,某些代理服務器可能欺騙HTTP_X_FORWARDED_FOR或將它全部關閉。 – zeroef

+0

@zeroef感謝您的幫助。我對HTTP_X_FOWARD_FOR進行了更改,但我仍然獲得相同的IP。我與基礎設施團隊進行了交談,結果發現這不是返回的服務器IP,而是真正的負載均衡器IP。有什麼想法嗎? – FelixMM

4

爲什麼你使用的時候,VB式服務器變量而不是Request.UserHostAddress

參見MSDN Library

正如其他人所說,如果不會使請求看起來像來自原始客戶端,您將獲得反向代理/ SSL終止符的IP地址(至少在ISA服務器中是這樣,並且可能在大多數其他反向代理中)。

如果沒有,您將得到客戶端的公共地址(這可能是客戶端的路由器地址,因爲大多數LAN都是NAT-ed)。

您的生產環境設置與您的測試環境有何不同?

實際上您是否獲取Web服務器的IP地址或同一網絡中的某個其他服務器的IP地址?

0

我看到這是一個老問題,但我碰到了它,我想我知道答案。答案比上面的更簡單......我今天剛剛遇到同樣的問題。我敢打賭,你試圖從XMLHTTP調用的頁面獲取IP,這將返回服務器IP,因爲它是提出請求的用戶,而不是用戶。

相關問題