【问题标题】:Nginx proxy pass real ip doesn't workNginx代理通过真实IP不起作用
【发布时间】:2017-02-06 08:12:01
【问题描述】:

我在 docker 容器中运行一个 nginx 反向代理服务器。而后端是运行在主机上的apache服务器,监听10082端口。 Laravel 处理请求。我使用

$request->getClientIp()

获取真实IP。但是,http://myip:10082不使用代理直接访问服务器的结果与反向代理访问的结果冲突。

laravel中的测试代码:

echo $request->ip().'<br>';
echo $request->headers->get('X-Real-IP').'<br>';
echo $request->getClientIp().'<br>';

代理结果:

192.168.80.2
218.205.17.167
192.168.80.2

没有代理的结果(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; 
    }

}

我很困惑。有人可以帮我解决它。谢谢!

【问题讨论】:

标签: php laravel nginx docker


【解决方案1】:

因为你已经在你的 nginx 代理中设置了 X-Real-IP 标头,所以它是真正的 ip。

【讨论】:

    【解决方案2】:

    我也遇到过同样的问题,并且花了很长时间解决这个问题。

    问题的触发是由于请求必须将 docker-proxy 传递给您的容器。 IP 已更改,基本上您将收到 docker-network 的网关 IP,而不是物理服务器。

    最新版本的 Laravel 包含 TrustProxies,但如果您收到的 REMOTE_ADDR 不是您的服务器 IP,这将无济于事。

    硬编码也不是解决方案,因为该 IP 可能会在您下次重新启动服务器/重新创建容器时更改。

    我自己解决了这个问题,假设假设 - 当我的服务器 IP 与 REMOTE_ADDR 有 3 个字节相同且后者以 .1 结尾时,可以安全地用作受信任的代理:

    在您的TrustProxies-middleware 的handle()-function 中:

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

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 2016-12-05
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-05-13
      • 2015-06-19
      • 1970-01-01
      相关资源
      最近更新 更多