jdavidbakr/cloudfront-proxies

为Laravel项目中的Cloudfront设置代理设置

1.6.7 2024-02-27 21:08 UTC

This package is auto-updated.

Last update: 2024-08-27 22:08:36 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配置文件。

然后一切应该都可以正常使用了。