这篇文章上次修改于 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_for
为 on;此外,在有多个代理服务器的情况下,会将代理服务器的 x-forwarded-for
头部的 IP 地址拼接,例如请求的过程为 client、nginx1、nginx2 目标服务器,那么 x-forwarded-for
中的信息为:client_Ip,nginx1_Ip,nginx2_Ip。
参考文章:
没有评论