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

Posted

技术标签:

【中文标题】AWS Cloudfront + 负载均衡器,url 从主域更改为负载均衡器子域【英文标题】:AWS Cloudfront + Load Balancer, url changes from main domain to load balancer subdomain 【发布时间】:2016-11-12 05:13:23 【问题描述】:

我的设置如下:

    用户在浏览器上输入 example.com 请求转到 AWS CloudFront,后者将 HTTP 重定向到 HTTPS,并将请求转发到 AWS Elastic LoadBalancer (elb.example.com) Lo​​adBalancer 将请求转发到运行 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?

【问题讨论】:

你能粘贴 .htaccess 的输出吗?您是否还检查了数据库的 URL 是“example.com”而不是 elb.example.com .htaccess 是一个文件,你要我分享这个文件吗?请解释一下 DB 是什么意思?你是说数据库吗?因为我认为数据库与这个问题无关 好吧 忘记舱口和数据库 你的网站域指向哪里?是使用 C 名称还是 IP 地址? 或者,如果您给我您网站的 URL,我可以更快地解决问题。 我的域 example.com 的别名指向 d123456.cloudfront.net,别名 elb.example.com 指向负载均衡器 【参考方案1】:

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

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

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

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

【讨论】:

感谢您的出色回答。我现在正在尝试,一旦我看到结果就会更新你 刚刚经历了这个,所有其他答案要么已经过时,要么太模糊而无法真正理解。这是一个演练:***.com/questions/69399672【参考方案2】:

与此同时,事情与最初的答案有所不同(在 AWS 方面)。因为它的核心仍然是正确的。 (将主机标头添加到白名单。)现在您需要将其配置为自定义 Cloudfront 策略。您需要在 Cloudfront AWS 控制台中创建此策略。

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

【讨论】:

这是一种新的更简单的方法。很有帮助,谢谢。 刚刚经历了这个,所有其他答案要么已经过时,要么太模糊而无法真正理解。这是一个演练:***.com/questions/69399672

以上是关于AWS Cloudfront + 负载均衡器,url 从主域更改为负载均衡器子域的主要内容,如果未能解决你的问题,请参考以下文章

用于 PHP 托管的 AWS CloudFront

从 http 重定向到 https 时,cloudfront 域被应用程序负载均衡器 dns 名称替换

AWS 将 EC2 替换为 CloudFront

我应该为 elb 和 aws S3 设置两个不同的 Cloudfront 发行版吗?

CloudFront、应用程序负载均衡器、EC2 获取重定向 301

将 CloudFront 与没有负载均衡器的单个 EC2 实例一起使用