我的设置如下:
- 用户在浏览器上输入 example.com
- 请求进入 AWS CloudFront,它将 HTTP 重定向到 HTTPS,并将请求转发到 AWS Elastic LoadBalancer (elb.example.com)
- LoadBalancer 将请求转发到运行 PHP Laravel 框架的 EC2 实例
- EC2 正常响应
- 用户在 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 请求标头。
这个问题已由 @michael-sqlbot 回答在 SO