Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2851462
  • 博文数量: 348
  • 博客积分: 2907
  • 博客等级: 中校
  • 技术积分: 2272
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-12 09:16
个人简介

专注 K8S研究

文章分类

全部博文(348)

文章存档

2019年(22)

2018年(57)

2016年(2)

2015年(27)

2014年(33)

2013年(190)

2011年(3)

2010年(14)

分类: 系统运维

2018-09-03 22:37:53

关于nginx多层uptstream转发获取客户端真实IP的问题

https://www.cnblogs.com/harryc/p/6361892.html

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[0-9\.]+),?.*$  $firstAddr;
    }

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


阅读(12518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~