autumndev / cloudfront-proxies
为 Laravel 项目中的 Cloudfront 设置代理
Requires
- guzzlehttp/guzzle: ^6.3|^7.0
- illuminate/support: 5.6.*|5.7.*|5.8.*|6.*|7.*|8.*|^9.0|^10.0
Requires (Dev)
- mockery/mockery: ~1.0
- orchestra/testbench: ~3.0|~4.0|~5.0|~6.0|^7.0|^8.0
- phpunit/phpunit: ~7.0|~8.0|^9.0|^10.0
This package is auto-updated.
Last update: 2024-09-10 14:07:39 UTC
README
用途
将应用程序置于负载均衡器或 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 地址作为受信任的代理。
解决方案
此包包含一个简单的中间件,执行两个非常重要的任务
- 将 CloudFront IP 地址下载到受信任的代理 IP 地址中。这根据您的缓存设置缓存一小时,因此您不必在每次请求上都进行此调用。
- 根据
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
配置文件,您可以编辑它。
从这里开始,一切应该都很顺利。