如何在 Saas App 中提供指向子域的自定义域

Posted

技术标签:

【中文标题】如何在 Saas App 中提供指向子域的自定义域【英文标题】:How to serve custom domains pointing to a subdomain in Saas App 【发布时间】:2012-05-13 09:23:48 【问题描述】:

我想创建一个示例 SaaS 应用程序,用户可以借此注册、创建网页、使用模板和/或使用自定义 css 对其进行自定义,在自定义域之外提供他们的网页。

我正在考虑将模板与媒体/样式表/js 文件一起保存在 S3/其他 CDN 上。虽然所有这些在技术上都是可能的(实用的?这可能是有争议的)。无论如何,在这种情况下,我很难弄清楚如何通过自定义域为网站提供服务?例如,当他们注册时,他们可以获得subdomain.domain.com 地址。但是,他们如何指向customerdomain.com,以便在输入customerdomain.com 时,它提供与customerdomain.domain.com 相同的内容,并且URL 仍然是customerdomain.com

此外,如果我想要一个“feature”,自定义域可能是一项付费功能。我如何将其限制为仅限付费用户使用?

通常,当我们设置网站时,我们会在虚拟主机配置文件 (apache) 中指定它,并为其指定别名,因此它会查找并提供这些别名。在这种情况下,我不希望每个注册的人都有一个单独的虚拟主机文件。有替代方案吗?我该如何编程?有什么需要注意的问题吗?

我见过的一个解决方案是让服务器提供一个通配符域,即*.domain.com,并为每个自定义域提供一个单独的虚拟主机,但如果可以的话,我宁愿避免。

谢谢。

【问题讨论】:

【参考方案1】:

自定义域通常通过 CNAME DNS 记录(类似于 DNS 记录的符号链接)完成。您告诉您的客户(通常控制 customerdomain.com)创建 CNAME 记录,说明 customerdomain.com 是 customerdomain.domain.com 的别名。然后,您需要设置自己的服务器来解释对 customerdomain.com 的请求,就像处理对 customerdomain.domain.com 的请求一样。

根据您为子域提供服务的方式,这可以通过几种不同的方式完成。

如果您为每个客户都有一个 vhost 文件,则需要为客户提供的自定义域添加“ServerAlias”指令。

如果您通过自己的应用程序服务器对入口点进行编码(例如,从 php 读取“Host”HTTP 标头,然后从中设置客户名称),那么您需要相应地调整该代码以解释对外部域的请求根据您自己的自定义域数据库。您甚至可以为此使用直接 DNS!

以下内容:

if http "host" header does not end in domain.com:
    cname = get_cname_record(http "host" header value)
    if cname does not end in domain.com:
        return error 404
    else:
        site = first part of cname
else:
    site = first part of http "host" header

然后您可以使用 DNS 作为您的“自定义域数据库”。但请确保您使用的是 DNS 缓存,因为这些查询将在每个请求上执行。

【讨论】:

谢谢,您的伪代码有助于理解解决方案。关于DNS缓存,在服务器上不是默认的吗?我的意思是 DNS 查询由操作系统(ubuntu)缓存。我需要为此做一些额外的事情吗? 这取决于你如何实现“get_cname_record”。如果您使用 gethostbyaddr() 或衍生工具(最可能的选项),您的系统通常已经提供了某种缓存。但是通过循环一堆查找来对其进行基准测试,这样你就不会陷入陷阱。我已经看到它发生了,所以仅供参考。

以上是关于如何在 Saas App 中提供指向子域的自定义域的主要内容,如果未能解决你的问题,请参考以下文章

如何允许用户将自定义域指向我应用程序的子域

面向 SaaS 产品客户的自定义域功能

directadmin 中子域的自定义路径目录

如何给 saas 软件提供 cname 前向支持

ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法

对于 SAAS 类型的 Web 应用程序、子域结构或 URL 结构,在可扩展性和安全性方面哪个更受欢迎?