如果web程序需要获取用户IP的时候,通常使用了

HTTP_X_FORWARDED_FOR 和REMOTE_ADDR来获取。


dim realIP
If Request.ServerVariables("HTTP_X_FORWARDED_FOR")="" Then
realIP=Request.ServerVariables("REMOTE_ADDR")
Else
realIP=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
End If
Response.write(realIP)

HTTP_X_FORWARDED_FOR 是http头传递过来的变量,如果用户用了代理,则该值取回来后为用户IP,代理服务器IP,(如果代理把用户IP传递过来的话。)

REMOTE_ADDR 是web服务器的socket里去回来的变量

如果web服务器在nginx的后端,

那么web程序取回来的REMOTE_ADDR 就是nginx服务器的IP了,

在nginx中 配置

location location ~*\.(aspx|ashx|asp)$
{
.....
       proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;
       proxy_set_header X-real-ip $remote_addr;
....
}

把nginx上取到的$proxy_add_x_forwarded_for的值添加到X-forwarded-for(http header http_x_forwarded)

把nginx上取到的$remote_addr的值给X-real-ip(htpp_x_real_ip)

$proxy_add_x_forwarded_for  是HttpProxyModule模块的变量;

引用官方解释

Contains client request-header "X-Forwarded-For" with separated by comma $remote_addr. If there is no X-Forwarded-For request-header, than $proxy_add_x_forwarded_for is equal to $remote_addr

如果没有这个请求头的话,$proxy_add_x_forwarded_for的值为$remote_addr

$remote_addr 是ngx_http_core_module的变量,为client的值,


nginx做了如上设置后,web端再用

IP1=Request.ServerVariables("HTTP_X_FORWARDED_FOR"))


IP2=Request.ServerVariables("HTTP_X_REAL_IP")

就能取回来了,当然 如果用户在没有使用http代理的情况下这2个值相等