Php Nginx代理传递真实ip不工作
我在docker容器中运行nginx反向代理服务器。后端是在主机上运行的apache服务器,它正在侦听10082端口。拉威尔处理这个请求。我用 $request->getClientIp 获得真正的ip。但是,访问服务器的结果http://myip:10082 直接无代理与反向代理访问结果冲突 laravel中的测试代码:Php Nginx代理传递真实ip不工作,php,laravel,nginx,docker,Php,Laravel,Nginx,Docker,我在docker容器中运行nginx反向代理服务器。后端是在主机上运行的apache服务器,它正在侦听10082端口。拉威尔处理这个请求。我用 $request->getClientIp 获得真正的ip。但是,访问服务器的结果http://myip:10082 直接无代理与反向代理访问结果冲突 laravel中的测试代码: echo $request->ip().'<br>'; echo $request->headers->get('X-Real-IP').'&l
echo $request->ip().'<br>';
echo $request->headers->get('X-Real-IP').'<br>';
echo $request->getClientIp().'<br>';
没有代理的结果XX.XXX.236.29是我的真实ip:
XX.XXX.236.29
XX.XXX.236.29
nginx的配置:
server {
listen 80;
server_name myserver.com;
access_log logs/myserver.access.log main;
location / {
proxy_pass http://myip:10082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我很困惑。有人能帮我解决吗。谢谢 因为您已经在nginx代理中设置了X-Real-IP头,所以它是真正的IP。我也遇到了同样的问题,并且花了相当长的时间在它上面 引发问题的原因是请求必须在发送到容器的过程中传递docker代理。IP已更改,基本上您将收到docker网络的网关IP,而不是物理服务器IP Laravel的最新版本包括TrustProxies,但如果您收到的远程地址不是您的服务器IP,那么这将毫无帮助 硬编码也不是解决方案,因为下次重新启动服务器/重新创建容器时,该IP可能会更改 我自己已经解决了这个问题,假设-当我的服务器IP与远程地址有3个字节相同,且后者以.1结尾时,可以安全地用作受信任的代理: 在TrustProxies中间件的句柄函数中:
$remoteAddr = $request->server->get('REMOTE_ADDR');
$serverAddr = $request->server->get('SERVER_ADDR');
if ($serverAddr && $remoteAddr) {
$lastDot = strrpos($serverAddr, '.');
if ($lastDot !== false &&
substr($remoteAddr, $lastDot) === '.1' &&
strpos($remoteAddr, substr($remoteAddr, 0, $lastDot+1)) === 0) {
$this->proxies[] = $remoteAddr;
}
}
退房:和
$remoteAddr = $request->server->get('REMOTE_ADDR');
$serverAddr = $request->server->get('SERVER_ADDR');
if ($serverAddr && $remoteAddr) {
$lastDot = strrpos($serverAddr, '.');
if ($lastDot !== false &&
substr($remoteAddr, $lastDot) === '.1' &&
strpos($remoteAddr, substr($remoteAddr, 0, $lastDot+1)) === 0) {
$this->proxies[] = $remoteAddr;
}
}