Typecho 提交评论后会保存评论者的 IP,如果启用了 CloudFlare CDN,默认获取的 IP 也是 CloudFlare 的 IP。

下面是 Typecho 的评论管理:

typecho后台评论管理

其中的 162.158.178.147 就是 CloudFlare 的 IP。

CloudFlare 会把用户真实 IP 放到请求头的 HTTP_CF_CONNECTING_IP ,PHP 可以通过 $_SERVER['HTTP_CF_CONNECTING_IP'] 获取用户真实 IP。

只需要修改一下文件,让 Typecho 使用 $_SERVER['HTTP_CF_CONNECTING_IP'] 就可以。

不需要修改源码,可以修改 Typecho 根目录的 config.inc.php ,在开头加入:

if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
    define('__TYPECHO_IP_SOURCE__', 'CF-Connecting-IP');
}

上面会检查 $_SERVER['HTTP_CF_CONNECTING_IP'] 是否存在,也就是检查是否启用了 CloudFlare CDN,如果启用就把用户的真实 IP 传给 Typecho。

$_SERVER['REMOTE_ADDR'] 是 PHP 获取 IP 的方式,Typecho 不会直接读取 $_SERVER['REMOTE_ADDR'],所以不能直接覆盖 $_SERVER['REMOTE_ADDR']

按照上面的方式修改后就可以获取用户真实 IP,就算禁用了 CloudFlare CDN,也能获取用户 IP,无需再次修改。