一般来说php是通过@$_SERVER[“REMOTE_ADDR”]这个变量来调用访问来源的IP地址,但是假如你用了cdn,这个变量就会变成cdn本身的IP,nginx系列的cdn就会出这种毛病。
解决方案有几个,首先nginx可以重新编译成自动修复REMOTE_ADDR变量的版本,但是这么做会让nginx更新变得很麻烦。大多数解决方案是cdn的nginx转发添加一个server变量比如@$_SERVER[‘HTTP_X_REAL_IP’],然后php直接用这个变量就行了,但是通常一个网站有多个php分开用@$_SERVER[“REMOTE_ADDR”],一个一个改麻烦不说,网站更新了,php就又可能变回原来的了。现在大多网站系统都插件化了,我们可以用插件来修一下这个变量,拿wordpress来说,搞一个如下代码的插件就足够了
add_action( 'plugins_loaded', 'eg_changecdn' ); function eg_changecdn(){ @$_SERVER["REMOTE_ADDR"]=getIP(); } function getIP() { $rem = @$_SERVER["REMOTE_ADDR"]; $cdn = @$_SERVER['HTTP_X_REAL_IP']; $ff = @$_SERVER["HTTP_X_FORWARDED_FOR"]; $ci = @$_SERVER["HTTP_CLIENT_IP"]; if(preg_match('/^(?:192\.168|172\.16|10\.|127\.)/', $rem)){ if($cdn){ return $cdn; } if($ff){ return $ff; } if($ci){ return $ci; } return $rem; } else { if($cdn){ return $cdn; } if($rem){ return $rem; } if($ff){ return $ff; } if($ci){ return $ci; } return "UNKNOWN"; } }
“使用cdn后php获取访问来源IP问题”上的3条回复
聪明机智的做法
真厉害
谁有做好了的插件啊