码蚁

打码改变人生

nginx 获取经过 CDN 的 HTTP 请求真实用户 ip

Posted at — Dec 23, 2018

经过 CDN 的请求 $remote_addr 为 CDN 节点 ip,并非用户真实 ip。

一般的 CDN 厂商在 Request Header 都会加上一个用户真实 ip 字段,如阿里云 CDN,会加上 Ali-Cdn-Real-Ip Request Header。

下面我们在 nignx 配置文件中使用 map 指令获取用户 ip,同时兼容经过 cdn 流量和非 cdn 流量的 HTTP 请求

    # 将变量值赋给 $client_ip
    map $http_ali_cdn_real_ip $client_ip {
        volatile;                       # 禁止变量值缓存
        default $http_ali_cdn_real_ip;  # 默认使用 $http_ali_cdn_real_ip
        ""    $remote_addr;             # 如果 $http_ali_cdn_real_ip 值为空(也就是没有这个 header),则使用 $remote_addr
    }

    # 将上面我们获取到的用户真实 ip,通过 X-Real-IP 发送到后端应用
    proxy_set_header X-Real-IP $client_ip;
comments powered by Disqus