我收集用戶訪問我的網站的IP地址統計信息,我注意到只有兩個IP地址172.16.16.1和172.16.16.248。我用來確定IP地址的屬性是UserHostAddress給出錯誤的IP
Request.UserHostAddress
什麼可能是IP地址信息丟失的原因?所有的用戶都來自世界各地,所以他們不能落後於兩個代理。
我收集用戶訪問我的網站的IP地址統計信息,我注意到只有兩個IP地址172.16.16.1和172.16.16.248。我用來確定IP地址的屬性是UserHostAddress給出錯誤的IP
Request.UserHostAddress
什麼可能是IP地址信息丟失的原因?所有的用戶都來自世界各地,所以他們不能落後於兩個代理。
這看起來像是一個反向代理的工作。 當您使用反向代理時,客戶端連接到代理,代理本身會打開到您的服務器的新連接。由於ASP.NET使用傳入連接的信息來填充用戶地址,因此您將獲得反向代理的地址。
如果您的確在使用此配置,您需要從反向代理獲得幫助以獲取正確的信息。大多數反向代理提供了向HTTP請求添加頭部以及客戶端的真實IP地址的可能性。檢查你的代理文件。
我假設你是後面的NAT /反向代理,所以我認爲你必須使用:
Request.ServerVariables("REMOTE_ADDR")
最有可能的是172.16.0.0/12您普里瓦局域網裏的172.16.16.248是你自己的地址和172.16 .16.1你的路由器/代理的地址。
您列出的兩個地址來自被定義爲私人的範圍之一。 (看here的描述)
這聽起來更像是你拿起自己的防火牆的內部地址?
你可能想要這樣的東西;
string SourceIP = String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? Request.ServerVariables["REMOTE_ADDR"] : Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",")[0];
HTTP_X_FORWARDED_FOR標頭獲取代理服務器後面的IP地址。
看到此頁面,解釋爲什麼更詳細; Getting The Real IP of your Users
我知道HTTP_X_FORWARDED_FOR標題,但我對這個問題的原因更感興趣。不管怎麼說,還是要謝謝你! – 2008-10-15 05:20:15
Request.ServerVariables(「REMOTE_ADDR」)不起作用。 這個問題是因爲你的服務器可能在一些代理服務器後面(或者通過某個網絡連接到互聯網)或者你的路由器設置被設置爲NAT(網絡地址轉換)這種技術不會將ip傳遞給服務器。在這種情況下,你無法使用Asp.net獲得IP地址 然而Java Provide applet使用它可以在任何情況下獲得IP地址。
(適用於Netscape,Mozilla和Firefox只,而Java必須啓用)
<script language="javascript" type="text/javascript">
if (navigator.appName.indexOf("Netscape") != -1){
ip = "" + java.net.InetAddress.getLocalHost().getHostAddress();
document.write("<b>Your IP address is " + ip+'</b>');
}
else {
document.write("<b>IP Address only shown in Netscape with Java enabled!</b>");
}
</script>
大廈戴夫·安德森的回答,這裏是一個片段,考慮到反向代理鏈。
string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
string ipStr = string.IsNullOrWhiteSpace(forwardedFor)
? Request.ServerVariables["REMOTE_ADDR"]
: forwardedFor.Split(',').Select(s => s.Trim()).First();
大廈tomfannings回答...
public static string ClientIp(this HttpRequestBase @this) {
var clientIp = string.Empty;
string forwardedFor = @this.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrWhiteSpace(forwardedFor)) {
clientIp = @this.ServerVariables["REMOTE_ADDR"];
} else {
var array = forwardedFor
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim());
foreach (var element in array) {
if (element.IsValidIp4() || element.IsValidIp6()) {
clientIp = element;
break;
}
}
}
return clientIp;
}
public static bool IsValidIp4(this string @this) {
var pattern = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$");
return pattern.IsMatch(@this);
}
public static bool IsValidIp6(this string @this) {
var pattern = new Regex(@"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(d|dd|1[0-1]d|12[0-8]))$");
return pattern.IsMatch(@this);
}
你沒有意思/ 16? – leppie 2008-10-14 10:14:21
不能,/ 12應該是正確的默認值。 =) http://en.wikipedia。org/wiki/Private_network – Node 2008-10-14 10:21:32