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
方法。
所以我基本上必须做的是:
- 创建一个设置可信代理的中间件。
- 使用我信任的代理创建一个配置文件。
配置我的反向代理转发正确的 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 的人使用。
在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);
}
}
在bootstrap/app.php
文件中,添加这个中间件:
$app->middleware([
//other middlewares........
App\Http\Middleware\TrustedProxiesMiddleware::class
]);
确保您的代理发送 X-FORWARDED-PROTO
header 到后端服务器
我在 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
方法。
所以我基本上必须做的是:
- 创建一个设置可信代理的中间件。
- 使用我信任的代理创建一个配置文件。
配置我的反向代理转发正确的 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 的人使用。
在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); } }
在
bootstrap/app.php
文件中,添加这个中间件:$app->middleware([ //other middlewares........ App\Http\Middleware\TrustedProxiesMiddleware::class ]);
确保您的代理发送
X-FORWARDED-PROTO
header 到后端服务器