2011-08-10 47 views
4

我已经apache2和nginx。我在配置中将“信任代理标头”设置为true,但无论如何,在拨打电话时获取内部IP $request->getClientIp();我该怎么做?Symfony的请求和反向代理

如果我使用参数$proxy = truegetClientIp联系,那么我得到正确的IP。但是有代理头启用的配置不够?

回答

0

总之:如果您打算使用某种反向代理,您总是需要使用$proxy = true。使用此参数集(并启用trustProxyData();),$this->getClientIp();将返回带有反向代理的正确IP。

说明:配置后,也代理头将返回HTTP_X_FORWARDED_FORHTTP_CLIENT_IP为用户IP,而REMOTE_ADDR将返回服务器本地主机地址(最可能是127.0.0.1)。 $proxy = true完全检查。下面是这个函数的源代码:

public function getClientIp($proxy = false) 
{ 
    if ($proxy) { 
     if ($this->server->has('HTTP_CLIENT_IP')) { 
      return $this->server->get('HTTP_CLIENT_IP'); 
     } elseif (self::$trustProxy && $this->server->has('HTTP_X_FORWARDED_FOR')) { 
      return $this->server->get('HTTP_X_FORWARDED_FOR'); 
     } 
    } 

    return $this->server->get('REMOTE_ADDR'); 
} 
+0

我看到这个代码。但是在生产中有代理,在开发测试服务器上没有代理。我应该写什么? 'getClientIp(IS_PROXY_ENABLED)'?这很丑陋。当我在Symfony的配置中启用代理时调用'trustProxyData()'。 – Koc

+1

为什么要麻烦?当没有代理时,'HTTP_CLIENT_IP'和'HTTP_X_FORWARDED_FOR'这两个头将被取消设置,并返回'REMOTE_ADDR'。 –