Lumen 没有检测到反向代理背后的 https

Lumen does not detect https behind a reverse proxy

我在 docker 容器中的反向代理后面有一个 Lumen API,它只在端口 80 上响应。因此客户端请求某个域 https://xyz.ab/api/endpoint 并且一切正常。

但是如果您想使用 Request->secure() 检查您是在 http 还是 https 流明 returns false (= http) 并生成错误的 url。

我试着用 URL::forceScheme("https"); 告诉 lumen 无论如何都要使用 https,但 lumen 仍然坚持使用 http。

我不想在我的容器中安装证书只是为了让 lumen 相信 https。

有什么地方可以让我全局配置 lumen 以使用 https 而不是 http?

谢谢。

谢谢你,PtrTon。这是正确的答案。 Lumen 使用 Illumintae\Http\Request 扩展 Symfony\Component\HttpFoundation,其中包括 setTrustedProxies 方法。

所以我基本上必须做的是:

  1. 创建一个设置可信代理的中间件。
  2. 使用我信任的代理创建一个配置文件。
  3. 配置我的反向代理转发正确的 headers,它们是:

    • X_FORWARDED_PROTO=https
    • X_FORWARDED_HOST={HTTP_HOST}
    • X_FORWARDED_FOR{HTTP_CLIENT_IP}
    • X_FORWARDED_PORT={SERVER_PORT}

对于 ssl,添加 X_FORWARDED_PROTO=https 或 X_FORWARDED_PORT=443 就足够了,因为这些是 secure() 方法正在寻找的值。一旦你添加它们并告诉 lumen 信任代理 secure() returns true.

这里有一个详细的实现,供那些不太熟悉 Lumen 的人使用。

  1. 在App\Http\Middleware下创建一个中间件(TrustedProxiesMiddleware)。

     <?php
    
     namespace App\Http\Middleware;
    
     use Illuminate\Http\Request;
    
     class TrustedProxiesMiddleware
     {
    
         /**
          *  use 0.0.0.0/0 if you trust any proxy, otherwise replace it with your proxy ips
          * 
          * @var string[]
          */
         protected $trustedProxies = [
             '0.0.0.0/0'
         ];
    
         public function handle(Request $request, \Closure $next){
             Request::setTrustedProxies($this->trustedProxies);
             return $next($request);
         }
     }
    
  2. bootstrap/app.php文件中,添加这个中间件:

     $app->middleware([
         //other middlewares........
         App\Http\Middleware\TrustedProxiesMiddleware::class
     ]);
    
  3. 确保您的代理发送 X-FORWARDED-PROTO header 到后端服务器