我想创建一个示例SaaS应用程序,用户可以通过自定义域名注册,创建网页,使用模板和/或自定义css,从自定义域提供网页。
我正在考虑在S3 /其他CDN上保存模板,以及media / stylesheets / js文件。虽然所有技术都可行(实用?可能有争议)。无论如何,我很难搞清楚在这种情况下如何通过自定义域提供网站?例如,当他们注册时,他们可以获得subdomain.domain.com
地址。但是,他们如何指出customerdomain.com
,以便在输入customerdomain.com
时,它提供与customerdomain.domain.com
相同的内容,并且网址仍为customerdomain.com
此外,如果我想要“feature
”,则自定义域可能是付费功能。我如何仅限付费用户?
通常,当我们设置网站时,我们在虚拟主机配置文件(apache)中指定它,并为其提供别名,以便查找并提供这些别名。在这种情况下,我不希望每个注册的人都有一个单独的vhost文件。还有其他选择吗?我该如何编程呢?有什么问题需要注意吗?
我看到的一个解决方案是让服务器提供通配符域,即*.domain.com
,并为每个自定义域提供单独的vhost,但是如果可以的话,我宁愿避免使用。
感谢。
答案 0 :(得分:7)
自定义域通常通过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缓存,因为这些查询将在每个请求中执行。