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)
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?
【问题讨论】:
你能粘贴 .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 从主域更改为负载均衡器子域的主要内容,如果未能解决你的问题,请参考以下文章
从 http 重定向到 https 时,cloudfront 域被应用程序负载均衡器 dns 名称替换
我应该为 elb 和 aws S3 设置两个不同的 Cloudfront 发行版吗?