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

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

我的设置如下:

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

这一切都是我想要的,但是......

  • 如果用户导航到页面上的任何按钮,浏览器上的 url 将变为 elb.example.com(它应该保持为 example.com)
  • 如果我去查看页面源代码,页面上任何按钮的所有链接都具有 elb.example.com 的基本 URL(应该是 example.com)

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

如何让 EC2 将基本 URL 视为 example.com ?

答案1

此行为可能是由于 CloudFront 默认将 Host: HTTP 请求标头设置为源主机名(在本例中为 elb.example.com)。然后应用程序可能会根据该主机名生成链接。

相反,如果您将 CloudFront 配置为将该标头列入白名单以转发到源,则浏览器 (example.com) 发送的主机标头将由 CloudFront 发送到应用程序,因此应用程序的行为应该更符合您的预期,并在生成链接时使用该值。这样,CloudFront 仍使用源服务器主机名执行所需的 DNS 查找,以建立与源 (在本例中为 ELB) 的 TCP 连接,但停止将该主机名注入 HTTP 请求标头。

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

这个问题已由 @michael-sqlbot 回答在 SO

相关内容