网站使用CDN后(CloudFlare等)网站日志获取真实IP地址 - 完全指导版
前言
当我们的Nginx使用了CDN以后,获取到的IP就不再是真实访客IP了,这是原始的访问日志记录就会出现问题.
此时就需要设置替换,根据cdn提供的HTTP请求头里的内容重写到日志中即可.
Apache
emmm...目前我主要使用nginx,等用到以后再补充教程吧!
Nginx
宝塔面板用户可跳过,直接跳到 宝塔面板 这一小节.
方法一
修改 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf 文件,添加在 http 字段中:
log_format access '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" ';
然后再修改当前站点/usr/local/nginx/conf/vhost/你的站点配置.conf 日志记录后加上 access
access_log /www/wwwlogs/你的站点配置.log access;
重启 Nginx,OK
service nginx reload
这个方法兼容性不好,下面的方法二可以兼容套CDN和没套CDN一起使用。
方法二
修改 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf 文件,添加在 http 字段中:
map $HTTP_CF_CONNECTING_IP $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9.]+),?.*$ $firstAddr;
}
log_format access '$clientRealIp [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'$http_user_agent $remote_addr $request_time';
主要是为了通用性,如果关闭了CDN,可以不需要修改获取IP的方式,所以才这么修改,不然直接用$HTTP_CF_CONNECTING_IP
就行了(这个时候就不需要在日志格式里使用$clientRealIp
)
然后在网站记录的日志定义使用access这个日志格式
比如
access_log /home/wwwlogs/abc.com.log main;
重启 Nginx,OK
service nginx reload
补充
上述代码均不兼容IPv6!
兼容代码如下:
map $HTTP_CF_CONNECTING_IP $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+),?.*$ $firstAddr;
}
宝塔面板
直接启用 nginx免费防火墙 - cdn - 打开即可.(无需上述一切操作!)
据反馈,貌似不兼容IPv6.仍有待改进.
2023-01-31更新
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
在nginx
配置的http {...}
中添加上述内容即可。