解决无法获取到真实IP地址

背景

目前由于国内备案不支持 .im 域名,导致只能通过海外服务器中转+CDN加速的方式来达成访问,这样的情况下不管是CDN加速还是frp内网穿透,都会导致服务端无法直接获取到真实的IP地址。

思路

通过学习Typecho源码发现,在/var/Typecho/Request.php的 660 行左右,找到了setIp方法,这个方法主要是switch循环,先尝试从$this->getServer(__TYPECHO_IP_SOURCE__)中获取 IP,然后再尝试从$this->getServer('REMOTE_ADDR')中获取IP,而查看getServer相关的代码,发现基本功能就是获取$_SERVER内的相关变量。

解决

通过代码逻辑可以知道,这是官方提前预留出的获取IP地址的方式,显然也是最正确的做法,只要在配置文件提前定义好常量__TYPECHO_IP_SOURCE__的值,那么程序就会优先从这个对应$_SERVER的成员中获取值。
在配置文件/config.inc.php中添加:

/** 定义 IP 来源 */
define('__TYPECHO_IP_SOURCE__', 'HTTP_ALI_CDN_REAL_IP');

这时候后端就能获取到真是的IP地址了,统计工具插件也就可以工作了。

推荐一款Typecho类似于百度统计的本地统计插件Access,还是很好用的。

标签:frp, docker, cdn, 真实IP地址