【问题标题】:How do I enable custom domains for my users?如何为我的用户启用自定义域?
【发布时间】:2016-01-29 19:14:19
【问题描述】:

我希望允许我的用户使用他们自己的域名来访问我的网络服务。

例如,如果我的用户的个人资料位于 example.com/users/david,我如何允许 david 使用 exampledavid.com 访问他的个人资料页面。

我不希望用户在地址栏中看到 example.com,而是让 david 看到 exampledavid.com。

【问题讨论】:

  • 当你实现它时,我可以注册名为“google”的用户,我真的想要“google.com”吗?
  • @Lashane 我不想注册域名。我希望大卫能够使用他已经拥有的域并将其指向他的个人资料页面。像博客这样的服务就是这样做的。所以是的,你可以注册一个名为“google”的用户,你会得到 example.com/users/google。
  • 那么他需要将他的域名指向你的域名服务器,你有吗?
  • @Lashane 是的,我愿意。我如何控制他的域指向的位置?
  • 你不能控制他的域,根据注册商客户应该做不同的改变

标签: dns domain-mapping domain-masking


【解决方案1】:

我看到了不错的答案,但这里没有人提供完整的图片。

如果您的客户只是 CNAME 到您的域或为您的 IP 创建 A 记录,并且您不处理这些自定义域的 TLS 终止,您的应用将不支持 HTTPS,没有它,您的应用将无法运行这些自定义域上的现代浏览器。

您需要在您的网络服务器前设置一个 TLS 终止反向代理。此代理可以在单独的机器上运行,但您可以在与网络服务器相同的机器上运行它。

CNAME vs A 记录

如果您的客户希望将您的应用放在他们的子域中,例如app.customer.com 他们可以创建一个 CNAME app.customer.com 指向您的代理。

如果他们想将您的应用放在他们的根域上,例如customer.com 然后他们必须在 customer.com 上创建一个指向您代理 IP 的 A 记录。确保此 IP 永远不会改变!

如何处理 TLS 终止?

要使 TLS 终止工作,您必须为这些自定义域颁发 TLS 证书。您可以为此使用 Let's Encrypt。您的代理将看到传入请求的 Host 标头,例如app.customer1.comcustomer2.com 等,然后它会通过检查 SNI 来决定使用哪个 TLS 证书。

代理可以设置为自动为这些自定义域颁发和更新证书。在来自新自定义域的第一个请求中,代理会发现它没有适当的证书。它会要求 Let's Encrypt 提供新证书。 Let's Encrypt 将首先发出挑战以查看您是否管理域,并且由于客户已经创建了指向您的代理的 CNAME 或 A 记录,这告诉 Let's Encrypt 您确实管理了域,它会让您为它。

要自动颁发和更新证书,我建议使用 Caddyserver、greenlock.js、OpenResty (Nginx)。

tl;dr 关于这里发生的事情; Caddyserver 监听 443 和 80,它自动接收请求、颁发和更新证书,代理到您的后端的流量。

如何在我的后端处理它

您的代理正在终止 TLS 并将请求代理到您的后端。但是,您的后端不知道请求背后的原始客户是谁。这就是为什么您需要告诉您的代理在代理请求中包含其他标头以识别客户的原因。只需添加 X-Serve-For: app.customer.comX-Serve-For: customer2.comHost 标头的原始请求即可。

现在,当您在后端收到代理请求时,您可以读取此自定义标头,并且您知道谁是请求背后的客户。您可以基于此实现您的逻辑,显示属于该客户的数据等。

更多

在您的代理队列前面放置一个负载平衡器,以提高可用性。您还必须为证书和 Let's Encrypt 挑战使用分布式存储。如果出现故障,请使用 AWS ECS 或 EBS 进行自动恢复,否则,您可能会在半夜醒来重新启动机器,或者手动重启您的代理。

如果您需要更多详细信息,可以在 Twitter @dragocrnjac 上私信我

【讨论】:

    【解决方案2】:

    您的问题可以通过 URL 重写和 HTTP 标头操作或反向代理来解决。

    • 对于 apache http 服务器:使用 ProxyPassReverse 指令

    ProxyPassReverse 指令允许 Apache 调整 URL HTTP 重定向响应的位置标头。例如这是 当 Apache 用作反向代理以避免绕过时必不可少 由于后端服务器上的 HTTP 重定向而导致的反向代理 留在反向代理后面。

    假设本地服务器地址为http://wibble.org/;那么

    ProxyPass /mirror/foo/ http://foo.com/
    ProxyPassReverse /mirror/foo/http://foo.com/

    不仅会导致本地请求 http://wibble.org/mirror/foo/bar 内部转换为 对http://foo.com/bar 的代理请求(功能 ProxyPass 此处提供)。它还负责重定向服务器 foo.com 发送:当http://foo.com/bar 被他重定向到 http://foo.com/quux Apache 将此调整为 http://wibble.org/mirror/foo/quux 在转发 HTTP 重定向之前 回复客户。

    • 对于 MS(R) IIS,使用 Re-Write 模块:

    轻松替换 Web 应用程序 URL 以产生用户和搜索引擎友好的结果。 URL Rewrite 允许 Web 管理员轻松地将响应 HTML 中由 Web 应用程序生成的 URL 替换为对用户更友好且对搜索引擎更友好的等效项。可以在反向代理后面的 Web 应用程序生成的 HTML 标记中修改链接。 URL 重写通过与 HTTP 请求和响应标头以及 IIS 服务器变量一起使用的出站重写规则,使出站响应内容和标头重写变得更加容易。

    此外,您必须确保 exampledavid(dot)com 已与 DNS 提供商一起设置,以便将 所有 请求传递到 example.com。

    DNS 记录示例:

    NAME                    TYPE   VALUE
    --------------------------------------------------
    exampleXYZ.com.         CNAME  example.com.
    example.com.            A      192.0.2.23
    

    参考:

    1. https://en.wikipedia.org/wiki/CNAME_record

    2. http://www.akadia.com/services/apache_redirect.html

    3. http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

    4. http://www.iis.net/downloads/microsoft/url-rewrite

    【讨论】:

    • 对于拥有数百个拥有自己域的用户的系统,您认为这是一种有效的方法吗?
    • 因为 exampledavid.com 不是 example.com 的子域,而 .com 是顶级域,所以你别无选择,AFAIK。
    【解决方案3】:

    您可以通过告诉您的客户配置 CNAME 以指向您的域来轻松启用此功能。

    因此,如果您的服务器位于 www.example.com,您告诉 'david' 将 www.exampledavid.com 配置为具有指向 www.example.com 的 CNAME 记录

    在服务器端,您将有一个配置来检测正在请求和重定向的域并将适当的内容提供给“大卫”

    如果您的客户想在您的服务器上使用裸域,例如 exampledavid.com,您需要向他们提供 IP 地址,但在执行此操作之前,您需要确保您的 IP 地址不会更改,并且可能与提供它的人签订合同以确保这一点。

    【讨论】:

    • 我对我的服务器端需要发生的事情感兴趣。您能否提供我需要检测和重定向域的“配置”的任何细节或示例?
    • 这在很大程度上取决于您使用的软件,并且根据您的配置有多种实现相同的方法。一旦您对自己的需求有所了解,可能值得将其作为一个单独的问题提出。
    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 2012-02-03
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多