被广告菌警告维护了

使用cdn后php获取访问来源IP问题

代码 egshuai 1025次浏览 3个评论

一般来说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问题 未经博主同意不允许转载
喜欢 (2)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. 聪明机智的做法
    凯哥自媒体2016-12-27 09:17 回复 Windows 7 | Chrome 47.0.2526.106
  2. 真厉害
    摩天之星2017-02-07 16:15 回复 Windows 7 | Firefox 51.0
  3. 谁有做好了的插件啊
    xsj2017-03-02 20:01 回复 Android 5.1.1 | Chrome 40.0.2214.89