簡述:
獲取 laravel
使用 cdn
後 獲取使用者的真實 ip
。
可以設定 TrustProxies
中介軟體 來設定 信任代理 ip
和代理頭。
不過在 laravel
裡面只能設定這些 。
一般我們獲取 cdn
或者 反向代理 都是通過這個 HEADER_X_FORWARDED_FOR
頭來獲取的。ip
的格式為:clientip,proxy1,proxy2。第一個就是客戶端的 ip
TrustProxies
中介軟體的配置
/**
* The trusted proxies for this application.
*
* @var array|string
* 這裡填反向代理的ip,支援填IP段
*/
protected $proxies = "
'127.0.0.1/24'
";
/**
* The headers that should be used to detect proxies.
* 這裡填用來檢測 ip 代理的頭部
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_FOR;
proxies
設定反向代理的 ip
或者 cdn
的ip
段,雖然可以填 *
號,但是我測試的時候獲取的還是 cdn
的 ip
獲取 ip
可以通過 Request
類,它也有輔助函式。
$request->ip();
$request->getClientIp();
request()->ip();
request()->getClientIp()
/** 這幾個方法都可以獲取客戶端的 ip **/
$request->ip() 方法是通過 $request->getClientIp() 方法獲取的
而 $request->getClientIps() 方法獲取的。
這裡說一下(我測試的時候) 如果 proxies
設定為 *
的話
通過 $request->getClientIp()
來獲取ip,獲取的是 CDN
的 ip
。
通過 $request->getClientIps()
獲取的結果
array:3 [▼
0 => "proxy1ip"
1 => "proxy2ip"
2 => "clientIp"
]
而我通過 $_SERVER['HTTP_X_FORWARDED_FOR']
列印出來的是,與 getClientIps
獲取的結果正好相反。
array:3 [▼
0 => "clientIp"
1 => "proxy2ip"
2 => "proxy1ip"
]
看一下 getClientIp
的程式碼,它獲取的是 getClientIps
的第一個ip.
正常來說,第一個ip應該是客戶端的ip的,但是 getClientIps
把結果翻轉過來了,我這裡 laravle
版本是 5.8
不知道其他版本是不是這樣。
更多 proxies
說明可以看這裡 https://symfony.com/doc/current/deployment...
如果 cdn
可以自定義真實ip頭的話,就可以在 /public/index.php 檔案來替換TrustProxies
設定的header
值
ps:第一次發文章,寫的不好請見諒?
本作品採用《CC 協議》,轉載必須註明作者和本文連結