最近,我从 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 - 使用 Amazon CloudFront CDN https://devcenter.heroku.com/articles/using-amazon-cloudfront-cdn
为您的 Heroku 应用程序配置 Amazon Route 53 DNS https://devcenter.heroku.com/articles/route-53
我相信必要的更改本质上很简单,并且非常感谢那些可能具有此特定配置经验的人的任何见解。
- -更新 - -
我还有最后一个问题,现在我的所有 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 分发缓存行为设置中,您可以选择
为了查看器协议政策从三个选项:
如果您希望 CloudFront 允许查看者使用 HTTP 或 HTTPS 访问您的 Web 内容,请指定 HTTP 和 HTTPS。如果您希望 CloudFront 将所有 HTTP 请求重定向到 HTTPS,请指定将 HTTP 重定向到 HTTPS。如果您希望 CloudFront 需要 HTTPS,请指定仅 HTTPS。
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(禁止)并且不返回对象。
天哪,我不知道托管个人网站有多复杂!