我通过client.example.com
将我的服务提供给我的用户,下面的页面如下
client.mysite.com/blog
client.mysite.com/blog/content/
client.mysite.com/docs/
等。
我希望允许用户允许他们的域指向这个子域。
因此,他们可以在以下1种选择中任意一种选择:
client.com -> client.example.com
sub.client.com -> client.example.com
client.com/sub/ -> client.example.com
页面应该自动工作,就像
client.com/blog -> client.example.com/blog
sub.client.com/blog -> client.example.com/blog
client.com/sub/blog -> client.example.com/blog
另外,我在Amazon中使用ElasticBean秸秆来使用nginx (Docker )部署我的React应用程序。在我开始之前,我想知道这是否可能,我也不想给我的客户固定的IP地址,以防我失去那个IP。blogger.com、wordpress.com等大公司是如何做到这一点的?
据我所研究,我知道cname可以允许客户端子域,我们需要命名域的IP地址。它没有提到那个文件夹。对于SSL,我可以使用LetsEncrypt。
我对任何类似CloudFlare / Route53方法都没意见。
发布于 2022-07-27 03:11:04
用于SaaS的云彩是为这个用例设计的。您只需转到Cloudflare仪表板> You域(example.com)、->、SSL、->、自定义主机名。添加客户端将链接到的回退主机名,例如ssl.example.com
。
然后客户端需要在您的应用程序中添加他或她的自定义主机名,然后通过自己的DNS提供程序添加一个CNAME
(指向ssl.example.com
)和TXT
记录来链接和验证他的自定义域。验证和颁发一个新的SSL需要几分钟时间,完全由Cloudflare处理,从此,客户端可以通过自定义主机名(例如client.com
、sub.client.com
、client.com/blog
等)访问您的服务。
如果您需要在HTTP响应通过客户的主机名时操作它,也可以通过一个CLoudflare工作脚本(链接到*/*
-所有主机名/URL)路由这些请求。
下面是一个示例,说明如何以编程方式创建自定义主机名:
import * as Cloudlfare from "cloudflare-client";
// Initialize custom hostnames client for Cloudlfare
const customHostnames = Cloudflare.customHostnames({
zoneId: process.env.CLOUDFLARE_ZONE_ID,
accessToken: process.env.CLOUDFLARE_API_TOKEN,
});
// Add the client's custom hostname record to Cloudflare
const record = await customHostnames.create(
hostname: "www.client.com",
ssl: {
method: "txt",
type: "dv",
settings: {
min_tls_version: "1.0",
},
}
);
// Fetch the status of the custom hostname
const status = await customHostnames.get(record.id);
// => { id: "xxx", status: "pending", ... } including TXT records
定价
用于SaaS的CF免费提供100个主机名和$0.10/hostname/mo (来源)。
基于路径的URL转发
如果您需要将HTTP流量转发到不同的端点,例如www.client.com/*
(客户域)到web.example.com
(SaaS端点),www.client.com/blog/*
到blog.example.com
等等。
您可以通过创建一个具有路由处理*/*
请求(所有客户主机名和所有URL路径)的Cloudfalre工作者脚本来实现这一点,该脚本看起来类似于以下内容:
export default {
fetch(req, env, ctx) {
const url = new URL(req.url);
const { pathname, search } = url;
if (url.pathname === "/blog" || url.pathname.startsWith("/blog/")) {
return fetch(`https://blog.example.com${pathname}${search}`, req);
}
return fetch(`https://web.example.com${pathname}${search}`;
}
}
参考文献
发布于 2022-07-28 20:58:07
对此,我已经在scale (10,000+客户端)中实现了最简单的方法,就是:
DNS
上面的例子实现了前两个用例--它允许客户机将根域或子域链接到您的服务。
要实现第三个用例,可以允许客户端为服务在其中运行指定任意根路径。如果客户端选择此操作,则还需要处理重定向到它们在其域中的其他服务。然而,这对你的应用来说是一个很大的责任。
您可以只是利用他们的注册员,大多数注册人有能力进行路径重定向-这是最简单的方法,需要最少的责任/维护在你的一端。
我还建议有一个选项,用于将所有入口点(即:根域、子域、根domain+path、subdomain+path)重定向到主入口点(即:根域+路径)。
注意:您还可以使用一个服务,比如wwwizer,它可以重定向到如果您的客户端根域上的别名选项不可用时指定的www。
SSL
我建议使用我们加密的ACMEv2 API为您的服务上设置的任何域启用SSL。有可用的库,您应该能够。
值得一提的是挑战--它可以通过DNS或HTTP发生。当您决定的库对新证书提出请求时,我们将通过发出请求来响应,以确保您控制域(通过检查DNS记录中的预定唯一散列)或控制它所指向的服务器(通过检查HTTP路径以获得预定的唯一散列)。这意味着您需要确保您的客户端要么在他们的DNS中包含您指定的哈希,要么您公开一个遵循ACME v2挑战响应协议(由您选择的库处理)的路由。
下面是一个示例库,如果您构建的服务是基于python的,它支持上面提到的所有特性,并且还包括一个cli:https://github.com/komuw/sewer。
参考文献
https://letsencrypt.org/docs/client-options/
发布于 2022-08-02 20:16:40
我想你要问的是如何让客户拥有他们自己的域名,拥有一个指向您网站的子域,并以某种方式提供相应的证书。但从安全的角度来看,海事组织没有安全的办法。以下是我的一些解决办法--你可以这样做:
您管理子域的DNS
您的客户可以为您拥有的公共Route53
发行版创建一个NS记录。然后,该子域将有效地属于您,您可以在其子域中创建DNS记录,并在ACM
中创建证书,您可以在Cloudfront分发版中使用这些证书。您可以在一个证书中拥有多个FQDN
,这样就不必有多个发行版了。您还需要将域添加到发行版中的别名中。
客户端管理自己的DNS,但您告诉他们要做什么。
我不确定这是否有效,因为我还没有尝试过,但是在对ACM证书的DNS验证中,您可以看到您需要创建的记录,您可以告诉客户端他们需要为AWS创建的CNAME记录,以便为给定的域(即sub.client.com
)颁发证书,他们还需要创建CNAME以指向您的网站。这样,客户端仍然管理自己的DNS。
进口证书
您可以让您的客户为您创建一个证书,然后您可以导入它。他们还需要创建CNAME记录来指向您的网站。再一次,他们需要创建一个CNAME来指向您的站点。可能最不安全,证书将需要手动旋转。
云锋
您的客户可以使用您的网站作为一个起源在他们自己的Cloudfront发行,有点讨厌,但会工作。我不认为这与不断增长的顾客有关系。
摘要
我不喜欢这些解决方案中的任何一种,它们都很混乱,很可能不符合安全标准,而且很难实现自动化。并不是说你不可能这样做。我建议您为您自己的域创建子域,或者将您自己视为一个托管公司,然后您将代表他们拥有/管理您的客户域,这样就更容易了。但是,在国际海事组织看来,拥有一个域名,然后把控制权交给它,或者转让证书是没有意义的。如果客户需要持有某些证书,或者需要持有这些证书,例如SOC2,您就会遇到麻烦。
https://stackoverflow.com/questions/73126594
复制