AWS Cloudfront + 负载均衡器,url 从主域更改为负载均衡器子域

AWS Cloudfront + Load Balancer, url changes from main domain to load balancer subdomain

我的设置如下:

  1. 用户在浏览器上输入 example.com
  2. 请求转到 AWS CloudFront,它将 HTTP 重定向到 HTTPS,并将请求转发到 AWS Elastic LoadBalancer (elb.example.com)
  3. LoadBalancer 将请求转发给 EC2 实例 运行 PHP Laravel framework
  4. EC2 正常响应
  5. 用户在 example.com 正确查看页面,其他所有内容对他来说都是透明的

这一切都是我想要的,然而.....

原因是因为 EC2 看到来自负载均衡器的请求,所以它假定基础 url 是 elb。example.com 并相应地生成所有链接。

如何让 EC2 将基数 url 视为 example.com?

此行为可能是由于默认情况下 CloudFront 将 Host: HTTP 请求 header 设置为原始主机名,在本例中为 elb.example.com。然后应用程序可能会根据该主机名生成链接。

相反,如果您将 CloudFront 配置为将 header 转发到源的白名单,则浏览器 (example.com) 发送的主机 header 将被发送到CloudFront 的应用程序,因此该应用程序的行为应该更像您期望的那样,并在生成链接时使用该值。有了这个,CloudFront 仍然使用源域名进行所需的 DNS 查找,以便建立与源(在本例中为 ELB)的 TCP 连接,但停止将该主机名注入 HTTP 请求 headers。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesForwardHeaders

您将在缓存行为设置下找到主机 header -> 基于所选请求的缓存 headers -> 白名单。

与此同时,原始答案(在 AWS 方面)发生了一些变化。因为它的核心仍然是正确的。 (将主机 header 添加到白名单。)现在您需要将其配置为自定义 Cloudfront 策略。您需要在 Cloudfront AWS 控制台中创建此策略。

创建自定义策略后,您可以使用分配的 'behaviours' 选项卡配置这个新创建的策略。这可以通过将 'cache policy' 更改为您新创建的策略来完成。