jdavidbakr / 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|^11.0
Requires (Dev)
- mockery/mockery: ~1.0
- orchestra/testbench: ~3.0|~4.0|~5.0|~6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ~7.0|~8.0|^9.0|^10.5
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
配置文件。
然后一切应该都可以正常使用了。