AWS Cloudfront 作为具有自定义域的 Heroku 站点的 CDN

2024-05-17

最近,我从 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(禁止)并且不返回对象。

天哪,我不知道托管个人网站有多复杂!


域名:burger.brianpatrickhummel.com

您将其指向 Route 53 中的 CloudFront...但在此之前,您需要创建一个新的 CloudFront 分配并将该主机名配置为该分配的备用域名。

DNS 目标:burger.brianpatrickhummel.com.herokudns.com

创建分配 CloudFront 时,将其配置为源域名。

在缓存行为设置中,将Host标头,以便 Heroku 能够了解该请求是针对哪个站点的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Cloudfront 作为具有自定义域的 Heroku 站点的 CDN 的相关文章

随机推荐

  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • .NET-MVC - 通过 SSL 重写 URL + 某些 URL?

    我有一个运行 IIS 6 NET MVC 和单个域名的网络服务器 该网站使用 URL 重写来生成如下 URL 域名 com controller action 我愿意强行一 1 个控制器 to use SSL 其他的应该无需 SSL 即可工
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • Android 中的 Google Places API - 适用于个人用户的 API_KEY

    我已经浏览了与在 Android 应用程序中使用 Places API 相关的 Android 文档和其他博客 到处都建议使用 API KEY 来调用 REST 服务 API KEY 在整个项目 应用程序中都是相同的 每天的请求数限制为 1
  • 企业发行版在 Swift 应用程序中与 iOS8 配合不佳

    我在使用 swift 应用程序在 iOS 8 设备上运行 Enterprise 版本时遇到问题 如果我使用非企业帐户进行代码签名 它似乎工作正常 有人遇到这个问题吗 以下是我在尝试使用企业帐户运行构建以进行协同设计时在 iOS 设备上收到的
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 从多个开发机器管理远程 docker 机器

    可以从另一个工作站管理使用 docker machine 命令从一个开发人员工作站创建的 docker 机器吗 我不是在寻找涉及 docker swarm 的解决方案 而只是寻找涉及 docker machine 的解决方案 据我了解 当
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 在状态栏下方显示DialogFragment内容

    我试图显示高度和宽度均具有 match parent 的 DialogFragment 但碰巧在顶部 DialogFragment 显示在 StatusBar 下方 DialogFragment 正在应用一些默认值来填充底部 右侧 左侧和顶
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 如何从清单文件(通常是清单文件与 kubectl 运行)使用 kubectl port-forward

    我正在尝试在本地使用 Kubernetes 运行我的第一个应用程序 或者我应该说 minikube 我有一个非常基本的 Web 服务器 一个本地 docker 镜像 和官方 mongodb 我想从 dockerhub 中提取 镜像 我并不是
  • 检查文件权限

    我怎样才能检查file permissions 无需通过运行操作系统特定命令passthru or exec Use 文件权限 http php net fileperms功能 clearstatcache echo substr spri
  • 异常:加载数据时 URL 获取失败

    我正在尝试设置我的机器来运行 Tensorflow 2 我从未使用过 Tensorflow 只是下载了 Python 3 7 我不确定这是否是我的机器的问题 我按照上面列出的安装说明进行操作TensorFlow 的网站 https www
  • kafka 连接 s3 源无法与 Minio 一起使用

    我已经验证了与 minio 的连接 确保凭据工作正常并且可以访问 minio 另外 如果我尝试任何其他值store url http minio 9000我无法保存配置 所以我猜想在可见性方面不存在问题卡夫卡连接容器和minio容器 我不确
  • AWS Cloudfront 作为具有自定义域的 Heroku 站点的 CDN

    最近 我从 AWS Route 53 brianpatrickhummel com 购买了一个域来托管个人投资组合 该投资组合网站已启动并正在运行 使用 S3 存储桶和 Cloudfront 作为 CDN 在作品集网站上 访问者可以预览我构