[转帖]Nginx代理获取后端用户真实IP

nginx,代理,获取,后端,用户,真实,ip · 浏览次数 : 0

小编点评

**1. 添加map模块参数** ```nginx map $http_x_forwarded_for $clientRealIp { "\"\" $remote_addr; ~^(?P\d+\.\d+\.\d+\.\d+)$ $firstAddr; } ``` **2. 修改upstream模块的ip_hash参数** ```nginx hash $clientRealIp; server { # ... upstream upstream_proxy { ip_hash; proxy_pass http://backend_server; } } ``` **3. 修改两处location模块的proxy_set_header参数** ```nginx location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # ... } location /old_path { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # ... } ``` **4. 设置X-Real-IP变量** ```nginx location / { proxy_set_header X-Real-IP $remote_addr; # ... } ``` **5. 获取用户真实IP的方法** * 通过设置X-real-IP层层传递 * 通过设置X-Forwarded-For请求头 **6. 获取CDN后用户的真实IP方法** * 如果CDN传递X-Forwarded-For请求头,则通过X-Forwarded-For请求头获取用户真实IP。 * 如果CDN没有传递X-Forwarded-For请求头,则通过正则匹配捕获到第一段,即用户的真实IP。

正文

https://www.cnblogs.com/paul8339/p/15740137.html

 

nginx代理后想获取用户的真实IP,

1.在http 模块内增加map模块参数:

                  map $http_x_forwarded_for $clientRealIp {
                          "" $remote_addr;
                          ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
                  }

2.修改upstream模块的ip_hash参数:

                hash $clientRealIp;

 

 

 

3.修改两处location模块的proxy_set_header参数:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 要加上以下俩个参数要不会报错
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;

 

 

 # 要加上以下俩个参数要不会报错

 

 

 

 

1. 几个概念
remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.
X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded-For: client, proxy1, proxy2
X-Real-IP:自定义的HTTP头,用于把客户端真实IP一层层传递下去。

2.几个变量
$remote_addr:上层IP(客户端或代理)
$proxy_add_x_forwarded_for:包括客户端请求头的X-Forwarded-For和$remote_addr
$http_x_forwarded_for:就是X-Forwarded-For的值

3. 获取客户端真实IP的方法
    3.1 通过设置X-real-IP层层传递
        首层代理:proxy_set_header X-Real-IP $remote_addr;   针对首层代理,拿到真实IP
        非首层代理:proxy_set_header X-Real-IP $http_x_real_ip;  # 针对非首层代理,一直传下去
    3.2 通过设置X-Forwarded-For请求头
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
        然后截取X-Forward-For请求头的第一段,即是客户端的真实IP

4. 经过CDN后,获取用户真实IP的方法
    4.1 一般CDN都会传递X-Forwarded-For请求头,通过X-Forwarded-For请求头获取用户真实IP。
    4.2 后端Nginx配置
    http {
        map $http_x_forwarded_for  $clientRealIp {
        ""      $remote_addr;
        ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
    }

    }        
    我们通过map自定义了一个变量$clientRealIp;
    如果X-Forwarded-For头是空的,那么客户端真实IP就是remote_addr;
    如果X-Forwarded-For头非空,我们就通过正则匹配,捕获到第一段,这就是用户的真实IP;
    必须注意的是,在每一层代理都要设置X-Forwarded-For头。

 

参考

多层代理获取用户真实IP - kaka_jon - 博客园
https://www.cnblogs.com/zhaojonjon/p/7293977.html

(26条消息) 代理后端的 Nginx 限制真实客户端IP访问问题_人生就是一场修行-CSDN博客_nginx限制客户端ip
https://blog.csdn.net/fgf00/article/details/82260249

与[转帖]Nginx代理获取后端用户真实IP相似的内容:

[转帖]Nginx代理获取后端用户真实IP

https://www.cnblogs.com/paul8339/p/15740137.html nginx代理后想获取用户的真实IP, 1.在http 模块内增加map模块参数: map $http_x_forwarded_for $clientRealIp { "" $remote_addr;

[转帖]Nginx系列之nginx四层反向代理

https://cloud.tencent.com/developer/article/2013908 上集说到nginx的http七层代理,其实它工作在OSI七层模型的应用层。由于其可以解析http协议,我们可以根据URI进行请求的分发,具有很大的灵活性,但是协议的解析存在性能的消耗。为了能获取更

[转帖]nginx反向代理时保持长连接

https://www.cnblogs.com/liufarui/p/11075630.html ·【场景描述】 HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。 如果我们使用了nginx去作为反

[转帖]Nginx 反向代理地址后,session丢失,不能登录的问题

https://www.cnblogs.com/fan-yuan/p/14417255.html 设置反向代理后,session丢失无法正常登录,需按照如下格式设置即可location /aaaaa/bbbbbb { #代理跳转的路径 proxy_pass http://localhost:8080

[转帖]nginx 反向代理中proxy_set_header的含义

https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请求头是传递给后端服务器的 2.ngixn反向代理中proxy_set_header的设置: prox

[转帖]Nginx 反向代理解决跨域问题

https://juejin.cn/post/6995374680114741279 编写代码两分钟,解决跨域两小时,我吐了。 如果对跨域还不了解的朋友,可以看这篇:【基础】HTTP、TCP/IP 协议的原理及应用 最近一段时间,在搞一个 SDK 的项目,使用的 TS + rollup。rollup

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

[转帖]Nginx反向代理中使用proxy_redirect重定向url

https://www.cnblogs.com/kevingrace/p/8073646.html 在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。proxy_redirect功能比较强大,其作用是对

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

[转帖]Nginx之proxy_redirect详解

今天在做nginx反向代理apache的时候出了一点点问题,原来后端apache用的端口是8080通过反向代理后,使用wireshark抓包发现location头域数值为http://192.168.1.154:8080/wuman/ 如果把这个返回给客户端肯定是不可以的,看起来别扭而且还暴露了ap