众所周知,当网站接入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']));

如下图所示:
Ip.png
填入文件最底端即可。

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


参考:
Cloudflare下取得访客真实IP

最后修改:2019 年 11 月 29 日 04 : 24 AM