众所周知,当网站接入 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']));
如下图所示: 填入文件最底端即可。
简单解说:
CDN 服务按照行业规范一般会设置 $_SERVER ['HTTP_X_FORWARDED_FOR'],保存来源 IP,当层数多于一层时以半角逗号,分隔。
CF 有一个特性,即它还会发送 $_SERVER ['HTTP_CF_CONNECTING_IP'] 保存请求 IP。由于我用的是 CF,所以我优先获取这个参数保存的 IP。
关于有人觉得 x-forwarded-for 容易被欺骗,经过 V2EX 网友的测试,CDN 会根据实际的转发情况将这个头部重写,只有 php 裸奔在 web server 的时候才会被欺骗。
评论