【发布时间】:2018-02-17 15:28:14
【问题描述】:
最近,我从 AWS Route 53 (brianpatrickhummel.com) 购买了一个域来托管个人投资组合。投资组合站点已启动并运行,使用 S3 存储桶和 Cloudfront 作为 CDN。在投资组合网站上,访问者可以预览我构建的一些应用程序,这些应用程序使用 iframe 元素在网站内启动,我注意到我在 Heroku 部署的应用程序需要 10-20 秒才能加载,因为这些网站上的访问者很少平均,没有 CDN 服务。
因此,我开始研究使用 AWS Cloudfront 作为 CDN。我从一个 Heroku 应用开始,添加了一个自定义域,现在配置如下:
Domain Name: burger.brianpatrickhummel.com
DNS Target: burger.brianpatrickhummel.com.herokudns.com
最后一步是“配置应用的 DNS 提供商以指向 Heroku 提供的 DNS 目标”。在这一步和正确配置 Cloudfront 发行版之间,我陷入了混乱的漩涡。我不确定在 Cloudfront、Route 53 或两者中进行某些 DNS/CNAME 更改的位置。
没有太多专门与这三种技术(Heroku、Cloudfront、Route 53)相关的在线文档,我花了很多时间在这三篇文章之间翻来覆去,但无济于事:
Heroku - Using Amazon CloudFront CDN
Configuring Amazon Route 53 DNS for Your Heroku App
我相信必要的更改本质上很简单,并且非常感谢那些可能对这种特定配置有经验的人的任何见解。
---更新---
我有最后一个问题,现在我的所有 Heroku 应用程序都已成功通过 Cloudfront 路由,我意识到所有具有生成 POST HTTP 请求的组件的应用程序都会收到 403 - 禁止错误。这与相应 AJAX 调用中的相对 URL 有什么关系:
$(document).on("click", ".saveButton", function () {
var thisId = $(this).attr("id");
$.ajax({
method: "POST",
url: "/save/" + thisId
}).done(function () {}
我在 Cloudfront 文档中看到以下内容:
CloudFront 始终缓存对 GET 和 HEAD 请求的响应。您还可以将 CloudFront 配置为缓存对 OPTIONS 请求的响应。 CloudFront 不会缓存对使用其他方法的请求的响应。
与成功发送请求相比,处理来自 Heroku 应用服务器的响应的问题更多吗?
-- 更新 2 --
根据 Cloudfront 文档中的此声明,我认为这与 HTTP/HTTPS 有关:
CloudFront 不会将 DELETE、OPTIONS、PATCH、POST 或 PUT 请求从 HTTP 重定向到 HTTPS。如果您将缓存行为配置为重定向到 HTTPS,CloudFront 会使用 HTTP 状态代码 403(禁止)响应该缓存行为的 HTTP DELETE、OPTIONS、PATCH、POST 或 PUT 请求。
Heroku 声明:
如果您想使用 SSL 为 Cloudfront 资产提供服务,您只需在 Amazon 提供给您的分发域上使用 HTTPS。请注意,虽然您可以为此创建 CNAME,但通过 CNAME 和 SSL 提供 Cloudfront 资产需要额外费用。
在 AWS Cloudfront Distribution Cache Behavior 设置中,您可以选择 查看者协议政策有以下三个选项:
如果您希望 CloudFront 允许查看者使用 HTTP 或 HTTPS 访问您的 Web 内容,请指定 HTTP 和 HTTPS。如果您希望 CloudFront 将所有 HTTP 请求重定向到 HTTPS,请指定将 HTTP 重定向到 HTTPS。如果您希望 CloudFront 需要 HTTPS,请指定 HTTPS Only。
Cloudfront 文档继续指出:
将 HTTP 重定向到 HTTPS 查看者可以使用这两种协议,但 HTTP 请求会自动重定向到 HTTPS 请求。 CloudFront 返回 HTTP 状态代码 301(永久移动)以及新的 HTTPS URL。然后查看器使用 HTTPS URL 将请求重新提交到 CloudFront。
当查看器发出重定向到 HTTPS 请求的 HTTP 请求时,CloudFront 会为这两个请求收费。对于 HTTP 请求,仅针对请求和 CloudFront 返回给查看器的标头收费。对于 HTTPS 请求,费用是针对请求以及您的源返回的标头和对象。
仅 HTTPS 只有使用 HTTPS 的查看者才能访问您的内容。如果查看器发送的是 HTTP 请求而不是 HTTPS 请求,CloudFront 会返回 HTTP 状态代码 403(禁止)并且不返回对象。
天哪,我不知道托管个人网站会有多复杂!
【问题讨论】:
标签: amazon-web-services heroku dns amazon-cloudfront amazon-route53