[英]How to get the client IP using a Symfony 4 application hosted on Azure Web App
我想記錄 Azure 上托管的 Web 應用程序(Symfony 4.1)上的每次登錄嘗試。
基於這個問題,為了獲取客戶端 IP,我正在使用:
// $requestStack being Symfony\Component\HttpFoundation\RequestStack
$ip = $this->requestStack->getMasterRequest()->getClientIp();
但是,日志告訴:
[2020-03-10 10:55:56] login_attempt.INFO: 用戶 'username' 從 ip '172.16.1.1' [] [] 成功登錄
如您所見,這是一個私有 IP 。 我試圖從不同的連接登錄,但我總是得到那個 IP, 172.16.1.1
。 這個IP從哪里來,如何獲取客戶端的真實公網IP?
該私有 IP 可以是負載均衡器或反向代理。
從文檔:
當您部署應用程序時,您可能會使用負載均衡器(例如 AWS Elastic Load Balancing)或反向代理(例如用於緩存的 Varnish)。
大多數情況下,這不會對 Symfony 造成任何問題。 但是,當請求通過代理時,某些請求信息將使用標准
Forwarded
標頭或X-Forwarded-*
標頭發送。 例如,用戶的真實 IP 將存儲在標准的Forwarded: for="..."
標頭或X-Forwarded-For
,而不是讀取REMOTE_ADDR
標頭(現在將是您的反向代理的 IP 地址)標題。如果您不配置 Symfony 來查找這些標頭,您將獲得有關客戶端 IP 地址的錯誤信息,無論客戶端是否通過 HTTPS 連接,客戶端的端口和所請求的主機名。
為了解決這個問題,可以在應用程序的受信任代理中添加該 IP。
在 Symfony 4 中,這可以通過以下方式完成:
// index.php
// creates the $_SERVER['TRUSTED_PROXIES'] entry if it doesn't exist/is empty with the IP of the proxy to trust as value
// or append ',the ip' to the existing entry
$_SERVER['TRUSTED_PROXIES'] = (empty($_SERVER['TRUSTED_PROXIES']) ? '' : ($_SERVER['TRUSTED_PROXIES'] . ',')) . '172.16.1.1';
// This is already in index.php, just let it doing its job
if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) {
Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}
現在,在日志中:
[2020-03-10 13:09:06] login_attempt.INFO:用戶'username'從ip'公共ip地址'成功登錄[][]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.