nginx代理web,后端无法获取用户真实IP

时间:2022-08-28 11:32:32

部署nginx后,后端用Request.UserHostAddress获取到的总是nginx服务器的ip,而不是用户的真实IP


解决方法:

nginx:

location / {
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header   Remote_Addr      $http_true_client_ip;
proxy_redirect     off; 
proxy_pass dest_web; #替换为自己的目标站点
}


IIS:

安装Url ReWriter,新建服务器变量REMOTE_ADDR(Request.UserHostAddress从该变量获取用户IP,所以把这个值替换为真实IP即可)

添加url重写规则,将REMOTE_ADDR替换为{HTTP_X_Forwarded_For}(请注意是下划线,不是中划线,并且以HTTP开头)

配置完成后web.config的system.webServer节点下信息如下:

<rewrite>
<rules>
<rule name="fix_ip">
<match url=".*" />
<serverVariables>
<set name="REMOTE_ADDR" value="{HTTP_X_Forwarded_For}" />
</serverVariables>
<action type="None" />
<conditions>
<add input="{HTTP_X_Forwarded_For}" pattern="^$" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>



至此大功告成,仅适用于后端需要大量修改代码的情况,用这种方法可以减少很多工作量; 但是如果要改的代码不多,建议还是从代码里通过读取ServerVariables来获取用户IP