2013-03-08 68 views
4

我在我的網站中有一段關鍵的代碼行,它在我們的開發環境中工作,但不在生產環境中工作。那麼,我說它在開發中工作,但事實是它給了::1,這是IPv6環回地址。Request.UserHostAddress返回負載平衡器的IP地址

無論如何,我想要做的是捕獲來到該網站的用戶的IP地址。因此,我使用Request.UserHostAddress來做到這一點。在開發中,正如我所說,它給了我回送地址,這是正確的,因爲我是從我的機器運行網站。在現場它做了一些完全不同的事情。它總是返回負載均衡器的地址。

我想明白的是這個。我錯誤地使用Request.UserHostAddress來捕獲用戶的IP地址,或者我們的網絡設置或其他問題有什麼問題嗎?

感謝,

薩欽

回答

8

從自己的應用程序中,如果不出意外已經完成,以幫助你,你就完蛋了。這是儘可能多的信息,可用於您。

如果幸運的話,您的負載均衡器已被配置爲添加一個或多個額外的標題,其中包含有關原始請求的信息。

一個常見的解決方案是X-Forwarded-For頭:

的X轉發,對於(XFF)HTTP報頭字段是用於識別通過連接到web服務器的客戶端的原始IP地址的事實標準一個HTTP代理或負載平衡器。

然後您將通過Request.Headers屬性訪問。

但是發現這個(或另一個)頭是否可用並不是我們可以提供的幫助 - 您需要與爲您的組織配置負載均衡器的人交談。

2

在參考@Damien_The_Unbelieveranswer,這裏的完整的解決方案:

public static string GetIpAddress() 
{ 
    var request = HttpContext.Current.Request; 
    // Look for a proxy address first 
    var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    // If there is no proxy, get the standard remote address 
    if (string.IsNullOrWhiteSpace(ip) 
     || string.Equals(ip, "unknown", StringComparison.OrdinalIgnoreCase)) 
    ip = request.ServerVariables["REMOTE_ADDR"]; 
    else 
    { 
    //extract first IP 
    var index = ip.IndexOf(','); 
    if (index > 0) 
     ip = ip.Substring(0, index); 

    //remove port 
    index = ip.IndexOf(':'); 
    if (index > 0) 
     ip = ip.Substring(0, index); 
    } 

    return ip; 
} 
+0

如果轉發的地址包含不止一個地址,那我們如何才能找到正確的地址? – 2016-09-28 12:02:31

+0

@當有多個IP地址時,它會保存,第一個定義客戶端的地址,其餘的是代理地址。它通常就像下面的client1,proxy1,proxy2。 – 2017-06-27 12:12:51

-1

使用此代碼來檢查生產環境......它的工作對我來說:

<% 

       System.Web.HttpRequest oRequest = System.Web.HttpContext.Current.Request; 

       string header; 
       string ip; 

       header = "HTTP_X_FORWARDED_FOR"; 
       ip = oRequest.ServerVariables[header]; 
       Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine); 

       header = "REMOTE_ADDR"; 
       ip = oRequest.ServerVariables[header]; 
       Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine); 

       header = "HTTP_CLIENT_IP"; 
       ip = oRequest.ServerVariables[header]; 
       Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine); 

       header = "Request.UserHostAddress"; 
       ip = oRequest.UserHostAddress; 
       Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine); 

      %> 
+1

您可以添加一些解釋,而不僅僅是代碼轉儲嗎? – Necoras 2017-03-09 20:53:12

+0

當我說「使用此代碼來檢查生產環境」時,我的意思是有幾種方法可以檢索客戶端IP,但彼此之間有一點點差異。我所做的是打印所有變量來檢查巫婆是否正確,實際上,HTTP_X_FORWARDED_FOR對我來說工作得很好! – 2018-03-07 14:00:25