反向代理同一个裸域到不同的主机

Reverse proxy same naked domain to different hosts

我正在使用 Cloudflare 管理我的域的 DNS。

的营销页面由 Netlify 托管。

主要应用程序由 Heroku 托管。

是否可以使用 cloudflare + 裸域 (my-example.com) 让某些路径由 Netlify 提供服务而其他路径由 Heroku 提供服务?

或者我是否被迫将其中一项托管服务放在子域上?

如评论中所述,可以使用cloudflare enterprise service。

但是您可以使用简单的 nginx 反向代理设置来完成。

将 DNS 解析为 nginx 反向代理并根据路径适当调用上游。

eg. example.com, and then direct queries for /path1 to 100.100.100.100 and for /path2 to 200.200.200.200

免责声明:我为 Netlify 工作。

您绝对可以做到这一点,而无需 运行 您自己的服务器或支付任何额外费用。

由于 Netlify 已经有一个 CDN,因此放置 cloudflare's CDN (activated with the 'orange cloud' in their settings) in front of Netlify's. Besides being inefficient, doing so breaks Netlify's atomic deploys and rollbacks 并不是最佳选择,并且根据我们的观察也会减慢页面服务。它可能有效,但不推荐。然而,CloudFlare 的 DNS 非常高效,可以在没有他们的 CDN 的情况下使用(关闭 'orange cloud')。他们的 DNS 可以很好地处理托管在 Netlify 的 CDN 上的内容。

以下是通过 Netlify 完成此设置的方法。

  1. 将您的静态资产部署到您的主要自定义域中的 Netlify 站点,假设它是 my-example.com。出于测试目的,您可以在 Netlify (something-something-1234.netlify.com) 中使用 built-in 站点名称,而不是 my-example.com。下面的示例重定向是 "host agnostic",因此将使用 Netlify 主机名 Netlify deploy previews 和生产主机名。
  2. 找到您的动态内容的所有路径 - 对于这个例子,假设它是动态的 /main/* 和 /app/* 并且您的后端托管在 Heroku 上。
  3. 创建 proxy redirect rules 以指向这些路径。如果您愿意,它们可以通过 CloudFlare 的 CDN 托管以保护您的 API - Netlify 代理到 Heroku 上的 CloudFlare-fronted 站点工作正常。您也可以选择直接代理到 Heroku,这样会更简单。 Netlify 有一些 DDoS 保护 built-in 并且仍然是 "in front of" 您的 Heroku 应用程序。由你决定。
  4. 部署这些代理规则并进行测试。

Netlify 的代理(技术上的反向代理)可以连接到您想要的任何后端,并且不会向访问者显示 URL - 它看起来像他们(浏览器中的 URL 栏, HTTPS 连接)就好像它们一直连接到 my-example.com,但内容是从您的后端返回的(包括 HTTP 状态代码。如果您的 Cache-Control: 指示,此响应将缓存在 Netlify 的 CDN 上Heroku 应用程序发送的 HTTP Header 指令。请注意 CloudFlare 将更改 你的 Cache-Control header 如果你将它设置在他们代理的内容上! Netlify 不会。)

这是一个常见的设置:

/main/* https://yourapp.herokuapp.com/main/:splat 200! /app/* https://yourapp.herokuapp.com/main/:splat 200!

请注意,如果您将 /main 或 /app 下的任何资产部署到 Netlify,由于这些规则的尾随 !,它们将被忽略。有关其工作原理和替代方案的更多详细信息,请参阅 https://www.netlify.com/docs/redirects/#note-on-shadowing(TL;DR:在 Netlify 上部署诸如 /main/logo.png 之类的东西,但 Heroku 不应该提供任何服务与为 /main/ 部署所有需要的内容* 在 Heroku 上)。

请注意,我建议在 Netlify 和 Heroku (/main/*) 上使用相同的路径而不是代理到 /somethingelse/*,因为当路径匹配时调试资产加载更容易。不过,这不是必需的。