众所周知,当网站接入CDN加速后,部分程序例如Typecho获取到的IP就不再是访客真实IP了。在appnode和宝塔中,有真实IP识别这个功能,但根据我的测试,并没什么用,评论照样显示的是cdn服务器的IP。

我最终的解决方案是在typecho的根目录中的config.inc.php文件添加如下代码:

/** 设置真实IP */
if(isset($_SERVER['HTTP_CF_CONNECTING_IP']))$_SERVER['REMOTE_ADDR']=$_SERVER['HTTP_CF_CONNECTING_IP'];
else
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))$_SERVER['REMOTE_ADDR']=end(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']));

 

如下图所示:
typecho接入CDN后获取访客真实IP-木头人123小站
填入文件最底端即可。

简单解说:
CDN服务按照行业规范一般会设置$_SERVER['HTTP_X_FORWARDED_FOR'],保存来源IP,当层数多于一层时以半角逗号,分隔。
CF有一个特性,即它还会发送$_SERVER['HTTP_CF_CONNECTING_IP']保存请求IP。由于我用的是CF,所以我优先获取这个参数保存的IP。
关于有人觉得x-forwarded-for容易被欺骗,经过V2EX网友的测试,CDN会根据实际的转发情况将这个头部重写,只有 php 裸奔在 web server 的时候才会被欺骗。