如果web程序需要获取用户IP的时候,通常使用了
HTTP_X_FORWARDED_FOR 和REMOTE_ADDR来获取。
1
2
3
4
5
6
7
|
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中 配置
1
2
3
4
5
6
7
|
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个值相等
本文转自天山三害 51CTO博客,原文链接:http://blog.51cto.com/skybug/1343291,如需转载请自行联系原作者