CDN如何获取客户端真实IP

通常我们接入又拍云 CDN 后,CDN 会获取源站资源缓存在 CDN,客户端请求网站资源也是直接从 CDN 边缘节点获取缓存,而非直接回源站,即使缓存失效,回源的也是 CDN 的服务器回源,那么如果我们希望获取客户端的真实 IP,我们可以在自己源站的 web 服务器加一个响应头去获取客户端的真实IP

又拍云 CDN 回客户源的时候会带上 X-Real-IP 和 X-Forwarded-For 的请求头下去,值为用户实际访问 CDN 的来源 IP 地址。特别地,为了兼容部分服务端程序,我们额外还提供了 Client-IP 请求头的支持,其值和 X-Real-IP、X-Forwarded-For 相同。

nginx配置

1.在配置文件中加入

add_header  X_Real-IP $http_x_real_ip;

如果需要输出到日志,也只需要定义下日志格式加入对应的头信息

http{
……
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                        '"$status" $body_bytes_sent "$http_referer" '
                                        '"$http_user_agent" "$http_x_forwarded_for" '
                                        '"$gzip_ratio" $request_time $bytes_sent $request_length';
}
server{
 access_log  /home/wwwlogs/awen.me-$year-$month-$day-access.log main;     
 }

日志格式可以参考 nginx 官网https://nginx.org/en/docs/http/ngx_http_log_module.html
然后查看日志,其中124.180.128.117 就是客户端IP

 157.119.232.9 - - [06/Jul/2017:13:52:33 +0800] "GET / HTTP/1.1" "304" 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1" "124.180.128.117" "-" 0.000 385 428
43.230.89.164 - - [06/Jul/2017:13:55:52 +0800] "GET / HTTP/1.1" "304" 0 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" "180.76.15.30" "-" 0.000 382 454