这篇文章上次修改于 839 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

一般情况下,ASP.NET Core 获取客户端 IP 地址的方法为 Request.HttpContext.Connection.RemoteIpAddress,但这只是在没有网关或者代理的情况下,如果客户端将请求发送到 Apache/Nginx,再由 Apache/Nginx 进行反向代理到目标服务器,例如Kestrel,这个时候在 Kestrel 里运行的 C# 代码,通过 Request.HttpContext.Connection.RemoteIpAddress 获取的 IP 地址,实际上是 Apache/Nginx 的 IP 地址,而不是真实的客户端 IP 地址。

  Apache/Nginx 在将请求进行重定向的时候,会在请求头里面增加一个 x-forward-for 信息,用以跟踪原有客户端 IP 地址和原来客户端请求的服务器地址。因此,在后台代码中,可以通过 Request.Headers["x-forwarded-for"] 来获取请求头里边的 IP 地址,即真实的客户端 IP 地址。

需要注意的是,在配置 server 节点的时候,如果将 forwarded_for 配置为 off,则 x-forwarded-for:unknown,默认的 forwarded_foron;此外,在有多个代理服务器的情况下,会将代理服务器的 x-forwarded-for 头部的 IP 地址拼接,例如请求的过程为 client、nginx1、nginx2 目标服务器,那么 x-forwarded-for 中的信息为:client_Ip,nginx1_Ip,nginx2_Ip

参考文章:

  1. Nginx反向代理后,java获取客户端真实IP地址