關於 Laravel 使用了 CDN 獲取真實 IP 記錄

Alone88發表於2020-02-13

簡述:

獲取 laravel 使用 cdn 後 獲取使用者的真實 ip

可以設定 TrustProxies 中介軟體 來設定 信任代理 ip 和代理頭。
不過在 laravel 裡面只能設定這些 。

關於Laravel 使用了CDN 獲取真實IP記錄

一般我們獲取 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 或者 cdnip段,雖然可以填 * 號,但是我測試的時候獲取的還是 cdnip
獲取 ip 可以通過 Request 類,它也有輔助函式。

$request->ip();
$request->getClientIp();
request()->ip();
request()->getClientIp()
/** 這幾個方法都可以獲取客戶端的 ip **/

$request->ip() 方法是通過 $request->getClientIp() 方法獲取的
而 $request->getClientIps() 方法獲取的。

這裡說一下(我測試的時候) 如果 proxies 設定為 * 的話
通過 $request->getClientIp() 來獲取ip,獲取的是 CDNip
通過 $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 不知道其他版本是不是這樣。
關於Laravel 使用了CDN 獲取真實IP記錄

更多 proxies 說明可以看這裡 https://symfony.com/doc/current/deployment...

關於 Laravel 使用了 CDN 獲取真實 IP 記錄

如果 cdn 可以自定義真實ip頭的話,就可以在 /public/index.php 檔案來替換TrustProxies設定的header

ps:第一次發文章,寫的不好請見諒?

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章