够意思博客够意思博客够意思博客

Nginx在CDN加速之后,获取用户真实IP

网站加了CDN之后

网站的访问模式变为:
用户浏览器 → CDN节点 → 网站源服务器


可以看到,我们的网站中间经历了好几层的透明加速和安全过滤, 这种情况下,我们就不能用上面的“普通配置”。因为普通配置中基于【源IP的限制】的结果就是,我们把【CDN节点】或者【阿里云盾】给限制了,因为这里 “源IP”地址不再是真实用户的IP,而是中间CDN节点的IP地址。

我们需要限制的是最前面的真实用户,而不是中间为我们做加速的加速服务器。

其实,当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录

X-Forwarded-For :  用户IP, 代理服务器IP

如果中间经历了不止一个代理服务器,这个记录会是这样

X-Forwarded-For :  用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ….

可以看到经过好多层代理之后, 用户的真实IP 在第一个位置, 后面会跟一串中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了。

那么针对CDN模式下的访问的Nginx的配置就应该这样写:

 location ~ / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        if (!-e $request_filename) {
             proxy_pass http://127.0.0.1:9599;
        }
        if (!-f $request_filename) {
             proxy_pass http://127.0.0.1:9599;
        }
        
        proxy_redirect off;
        proxy_set_header http  $scheme;
        proxy_set_header referer $http_referer;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
        proxy_set_header Upgrade $http_upgrade;   # 升级协议头
        proxy_set_header Connection upgrade;
    }

这样就可以在EasySwoole中获取到用户的真实IP

public function getRealIp(){
   // 真实IP
   $ip = '';
   if (count($this->request()->getHeader('x-real-ip'))) {
       if(!empty($this->request()->getHeader('x-forwarded-for')[0])){
           $ip = explode(',',$this->request()->getHeader('x-forwarded-for')[0])[0];
       }
       $ip = $ip??$this->request()->getHeader('x-real-ip')[0];
   } else {
       $params = $this->request()->getServerParams();
       foreach (['http_client_ip', 'http_x_forward_for', 'x_real_ip', 'remote_addr'] as $key) {
           if (isset($params[$key]) && !strcasecmp($params[$key], 'unknown')) {
               $ip = $params[$key];
               break;
           }
       }
   }
   return $ip;
}



本文为够意思原创文章,转载无需和我联系,但请注明来自够意思博客blog.go1s.cn:够意思博客 » Nginx在CDN加速之后,获取用户真实IP

加载中~