2011-08-10 89 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'。 –