如何从HTTP头中获取客户端的IP地址?
从上面的内容可以看出,问题的出现原因是希望从HTTP头部获取客户端的IP地址。解决方法是使用提供的ASP.Net静态方法,通过遍历请求的HTTP头部,查找特定的键值对来获取客户端的IP地址。该方法还提供了跳过私有IP范围的选项。
首先,定义了一个名为ClientIP的静态类,其中包含了一个名为ClientIPFromRequest的扩展方法,用于从请求的HTTP头部获取客户端IP地址。该方法遍历了一个名为s_HeaderItems的列表,该列表中包含了需要检查的HTTP头部键值对。对于每个键值对,首先获取对应的IP字符串,然后根据是否需要拆分进行处理。如果需要拆分,则将IP字符串按逗号分隔,并逐个检查每个分隔后的IP地址是否为有效的IP地址,并且可选择跳过私有IP范围。如果不需要拆分,则直接检查IP字符串是否为有效的IP地址,并可选择跳过私有IP范围。如果所有的检查都不满足,则返回请求的UserHostAddress。
其次,定义了一个名为ValidIP的私有静态方法,用于检查IP地址是否为有效的IP地址,并可选择跳过私有IP范围。该方法首先将IP字符串进行修剪和判断,然后尝试解析为IPAddress类型的IP地址。如果解析失败,或者解析出的IP地址不是IPv4或IPv6地址,则返回false。如果需要跳过私有IP范围,并且解析出的IP地址是IPv4地址,则将IP地址转换为UInt64类型的值,并遍历私有IP范围数组,判断该IP地址是否在私有IP范围内。如果在范围内,则返回false。否则,返回true。
接下来,定义了一个名为IpRange的私有封闭类,用于描述和比较IP地址范围。该类包含了一个构造函数用于初始化起始和结束IP地址,以及一些用于转换和比较IP地址的方法。其中,AddrToUInt64方法用于将IPAddress类型的IP地址转换为UInt64类型的值,ParseToUInt64方法用于将字符串类型的IP地址解析为UInt64类型的值,Encompasses方法用于判断指定的UInt64类型的IP地址值是否在范围内,Encompasses方法还重载了一个接受IPAddress类型参数的版本,用于将IPAddress类型的IP地址转换为UInt64类型的值后再进行比较。
最后,定义了一个名为s_PrivateRanges的私有静态IpRange数组,用于存储需要跳过的私有IP范围。该数组中包含了多个IpRange对象,每个对象表示一个私有IP范围。
以上就是从给定的内容中整理出的关于如何从HTTP头部获取客户端IP地址的问题的出现原因和解决方法。
如何从HTTP头中获取客户端的IP地址?
在除了REMOTE_ADDR
和HTTP_X_FORWARDED_FOR
之外还有一些其他可以设置的头部,如:
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
可以是逗号分隔的IP列表HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
我在以下网站找到了有用的代码:
http://www.grantburton.com/?p=97
这个列表是否完整,是否覆盖了90%以上的代理?
我认为这些头部不应该有HTTP_前缀...经过一番搜索,我找到了stackoverflow.com/questions/3834083/…
现在还有一个Referer,根据RFC 7239。