如何解决反向代理阻止 Laravel 向客户端发送标头
我正在 Amazon EC2 中部署 Laravel REST API,并使用应用程序负载平衡 (ALB) 作为反向代理。因此,架构基本上是客户端 -> Route 53(解析 DNS)-> 负载均衡器 ALB(反向代理)-> 带有 Ubuntu 和我的 Laravel 应用程序的 EC2 实例。
由于 Laravel 使用 Symfony 库来处理代理,因此我按照 this Laravel doc 和 this Symfony doc 在我的 Laravel 应用程序中将我的 ALB 设置为可信代理,从而使我的 EC2 实例只能通过我的 ALB 访问 - 但我也可以通过 SSH 访问我的 EC2 - 留下 App\Http\Middleware\TrustProxies
如下:
<?php
namespace App\Http\Middleware;
use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string|null
*/
protected $proxies = '*';
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB; // Request::HEADER_X_FORWARDED_ALL;
}
因此,显然我的应用可以通过反向代理标头(特别是 HEADER_X_FORWARDED_AWS_ELB
)从客户端接收 HTTP 标头。
但是,客户端应用程序根本不接收 HTTP 响应标头,例如 CORS(我使用 Laravel 默认 \Fruitcake\Cors\HandleCors
库来处理 CORS)或 'Accept': 'application/json'
,导致客户端出现 CORS 错误。
因此,换句话说,我的 Laravel 应用响应标头将无法通过我的反向代理 ALB。
有谁知道发生了什么以及如何/如果我能解决这个问题吗?
解决方法
验证退出 EC2 实例的 HTTP 响应是否包含正确的回复标头可能很有用。您可以在 EC2 实例上运行 tcpdump 来验证这一点。这至少可以确认是否是 ALB 导致了问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。