Php Nginx代理传递真实ip不工作

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

我在docker容器中运行nginx反向代理服务器。后端是在主机上运行的apache服务器,它正在侦听10082端口。拉威尔处理这个请求。我用

$request->getClientIp

获得真正的ip。但是,访问服务器的结果http://myip:10082 直接无代理与反向代理访问结果冲突

laravel中的测试代码:

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;
   }
}