zoukankan      html  css  js  c++  java
  • 多层代理获取用户真实IP

    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头。

  • 相关阅读:
    关于课程设计、毕业设计的一些总结与思考
    分享一个Panda C-60 维修心得
    未能加载文件或程序集“SuperMap.Data.dll”
    VS2017环境下安装AO10.2的方法
    SQL Server连接错误1326
    VMWare虚拟机中CPU过高的问题
    Apktool编译找不到“keyboardNavigationCluster”
    Aspose.Cells设置单元格格式
    谷歌Chrome浏览器无法安装插件的解决方法
    Global Mapper如何加载在线地图
  • 原文地址:https://www.cnblogs.com/zhaojonjon/p/7293977.html
Copyright © 2011-2022 走看看