关于 Laravel 使用了 CDN 获取真实 IP 记录
简述:
获取 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 协议》,转载必须注明作者和本文链接
推荐文章: