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



我的设置如下:

  1. 用户类型 example.com 在浏览器上
  2. 请求转到 AWS CloudFront,后者将 HTTP 重定向到 HTTPS,并将请求转发到 AWS Elastic LoadBalancer (elb.example.com)
  3. 负载均衡器将请求转发到运行 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 将基本网址视为 example.com?

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

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

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

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

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

创建自定义策略后,您可以使用分配的"行为"选项卡配置此新创建的策略。这可以通过将"缓存策略"更改为新创建的策略来完成。