autumndev/cloudfront-proxies

为 Laravel 项目中的 Cloudfront 设置代理

v1.0 2023-05-10 10:50 UTC

This package is auto-updated.

Last update: 2024-09-10 14:07:39 UTC


README

Latest Version on Packagist Total Downloads Travis

用途

将应用程序置于负载均衡器或 CDN 后的一大优点是,您可以在那里终止 TLS,并通过 http 向应用程序发出请求。然而,问题是应用程序不知道访问它的协议。这会导致 Laravel 的 URL 生成工具出现问题,因为资产将被 http 前缀。

Laravel 通过使用 TrustedProxies 包来很好地处理这个问题,该包允许您定义要使用哪些 IP 地址和哪些标头来将传入请求转换为原始请求的 IP 地址和协议。

这本来是个美好的解决方案,直到 Laravel 5.6 发布。这个版本的 Laravel 使用了 Symfony 版本 4,不再公开您想要用于确定协议的标头。您可能会说这不是问题,因为您可以使用 X-Forwarded 标头?但这不会成为问题,除非 CloudFront 使用一个特殊的标头 Cloudfront-Forwarded-Proto - 因此现在没有简单的解决方案来设置协议。

此外,您可能不想将所有 IP 地址暴露给受信任的代理设置 - 理想情况下,我们应该只使用 CloudFront IP 地址作为受信任的代理。

解决方案

此包包含一个简单的中间件,执行两个非常重要的任务

  1. 将 CloudFront IP 地址下载到受信任的代理 IP 地址中。这根据您的缓存设置缓存一小时,因此您不必在每次请求上都进行此调用。
  2. 根据 Cloudfront-Forwarded-Proto 的值向您的请求添加 X-Forwarded-Proto 标头。这有助于 Symfony 表现得好像原始标头就是它一开始需要的。

此中间件仅在 Cloudfront-Forwarded-Proto 标头存在于传入的标头中时才会触发,因此如果您正在使用其他负载均衡器或直接访问服务器,则会被忽略。请注意,CloudFront 默认不会发送此标头 - 必须明确将其列入白名单。(有关发送标头和 Cookie 的更多信息,请参阅 CloudFront 文档)

用法

要使用,请通过 composer 安装

composer require jdavidbakr/cloudfront-proxies

然后将中间件添加到您的内核中,在 TrustProxies 中间件之后

        \App\Http\Middleware\TrustProxies::class,
        \jdavidbakr\CloudfrontProxies\CloudfrontProxies::class,

如果您想,可以发布配置文件以获取一些选项的访问权限

php artisan vendor:publish

这将发布一个 cloudfront-proxies.php 配置文件,您可以编辑它。

从这里开始,一切应该都很顺利。