一、背景
也记不得是去年阿里云搞的哪个活动了,反正笔者我在那会儿参加了一个CDN优惠购流量的活动,现在每个月都有20G的CDN流量包会充值进来。
毕竟自己也是花了钱的,不用就太可惜了。所以我把自己几个主要对外的网站都接入了阿里云的CDN服务。
不过在用了一段时间之后发现了一个问题,那就是后台看不到提交评论的用户IP了。
一开始在后台看到提交评论的用户IP清一色是192.168.16.x的一个地址,经过检查之后发现这个地址是因为我把WordPress放进docker了之后,新增加的网桥地址段的地址,而那个192.168.16.x的IP正是ECS宿主机的获得IP段。所以先设置了Nginx反向代理的时候将访客的IP设置到 X-Real-IP头上。
但后来发现还是不对,因为访客在提交评论请求的时候是直接发给阿里云的CDN服务器,再由阿里云的CDN服务器向我的服务器发起回源请求,此时Nginx获得的客户端IP,并不是访客的真实IP,而是阿里云CDN服务器的IP。
二、解决方案
翻了阿里云CDN的文档,也没找到说回源的时候会不会带访客IP的文档。没办法,那就自己动手看看吧。
把下面的代码保存到“test.php”里(文件名随意,后缀名使用php):
1 2 3 |
<?php print_r($_SERVER); ?> |
这个命令是用来打印在接受请求时,所有的服务器变量。然后把这个文件放到网站根目录下,再用浏览器访问这个test.php。
因为这个页面是新增的,CDN服务器上是没有这个页面的缓存的,所以这个请求最终会回源到我的服务器上。
可以看到阿里云CDN在回源的时候会加上几个“HTTP_ALI”的头:
而我们想要的访客真实IP,就被放在了“HTTP_ALI_CDN_REAL_IP”头里。
有了访客真实IP之后,我们就需要让WordPress去识别这个IP,操作如下:
编辑WordPress根目录下的“wp-config.php”文件,添加以下代码:
1 2 3 4 |
if (isset($_SERVER['HTTP_ALI_CDN_REAL_IP'])) { $http_x_headers = explode( ',', $_SERVER['HTTP_ALI_CDN_REAL_IP'] ); $_SERVER['REMOTE_ADDR'] = $http_x_headers[0]; } |
添加完成后保存文件并重启网站即可,为了防止一些不必要的信息泄漏,记得删掉刚刚试验时添加的test.php。
小柊
2018年6月30日 23:41:03
1 条评论发布于 “WordPress获得经过阿里云CDN服务的访客真实IP”