7

我正在 LAMP 堆栈中创建一个应用程序,我想为用户提供使用他们自己的域而不是我网站的子域的能力。例如。

而不是:http ://some_user.mysite.com

他们将使用:http ://store.some_user.com/

我知道有几家公司使用 CNAME 记录提供此服务。(http://help.bigcartel.com/articles/14-using-a-custom-domain)但是我不确定他们如何实现端到端的。

我的问题是:

  1. 这个过程叫什么?(所以如果需要,我可以进一步研究)

  2. 我需要做什么来提供这个?IE。我需要在 DNS、apache 和 php 端做什么才能使其正常工作?

任何建议、链接或代码片段将不胜感激。

谢谢


更新

到目前为止,我已经能够设置通配符 DNS 条目,但是我仍然遇到 CNAME 记录解析到另一个域的问题。例如。

http://store.weareunified.com/ -> http://weareunified.joshstuart.com.au/

weareunified.com(这是一个测试用户主机)DNS

weareunified.com. A 111.67.3.227
store CNAME weareunified.joshstuart.com.au.

joshstuart.com.au(这是主要的应用程序主机)DNS

joshstuart.com.au. A 111.67.3.227
* CNAME joshstuart.com.au.
4

5 回答 5

7

我使用 LAMP 进行了此设置,并且效果很好。我是这样做的:

  1. 带有我的应用程序的目标服务器位于正常的 A 记录(子)域上。因此,在您的情况下,我假设您的应用程序在joshstuart.com.au上运行。
  2. 客户端需要将 store.weareunified.com 的 DNS 条目更改为 CNAME 到joshstuart.com.au
  3. Apache 服务器有一个没有域规范的虚拟主机(在我的例子中),只是一个<VirtualHost *:80>

就是这样。目前有 70 多个 CNAME 到主应用程序域的域,它们每个都根据需要为各自的站点提供服务(没有重定向等)。

于 2011-03-09T11:03:41.583 回答
5

实际上,你不需要做任何事情。

您的用户需要让他们的 DNS 提供商添加一个 CNAME 记录,该记录基本上将http://app.some_user.com/映射到http://some_user.app.com

任何寻找http://app.some_user.com/的 DNS 客户端都被告知要寻找http://some_user.app.com,因此这是 DNS/客户端问题,而不是服务器问题。

Amazon 向 EC2 服务器的用户推荐了这种技术。

请注意,CNAME 记录有一个限制,它们不能分配给域的根 - 您的用户不能分配http://some_user.com/,只能将http://app.some_user.com/分配为 CNAME。

于 2011-02-15T11:24:47.767 回答
1

我有类似的东西,我用 cpanel api2 做的。

基本上,用户将他的域指向我的 dns,我使用 api 将他的域停放在我的域上。

我将每个用户的域存储在数据库中。

在页面加载时,我提取 http_host 并将其与我的数据库进行比较以查看域是否存在。然后,我根据用户设置(我从同一个脚本提供所有页面)和数据库条目来加载页面。

为了减少数据库负载,我将信息保存在标识主机的会话中。然后我可以在每次后续加载时检查这个,而不是每次都检查数据库。

于 2011-03-07T14:21:52.267 回答
0

另一种可能性是实际上是用户的 DNS 主机并处理所有记录。您可以为此获得开源解决方案。(但您可能需要在不同子网上拥有两台 DNS 服务器)。

于 2011-03-09T10:45:31.790 回答
0

这里有几个不同的部分——设置 DNS 条目,然后让 Apache 响应请求。

您是否为客户正确设置了 CNAME?请注意,您不能在 weareunited.com 上设置 CNAME,它必须在 store.weareunited.com 或其他不是根域的主机名上。

听起来你可能不明白 CNAME 的工作原理。一个过于简化的版本是,当用户请求 store.weareunited.com 时,他们的本地名称服务器(例如,在最终用户的 ISP 中的名称服务器。对于康卡斯特的我来说,它通常是比弗顿的康卡斯特 NS,或者。这是假设本地名称服务器尚未解析主机名并且没有缓存)将查询根名称服务器以确定谁负责该域。然后本地 namserver 将查询域名服务器以获取记录。该记录可以是一个 A 记录,它是一个 IP 地址,也可以是一个 CNAME,它指向另一个主机名。

当本地namesever 获得CNAME 时,它会再次运行这个过程来获得A 记录。一旦它最终得到带有 IP 地址的 A 记录,它会将 IP 地址交还给最终用户的浏览器,Web 浏览器会向该 IP 地址发出请求。

最终结果是 Web 浏览器获得一个 IP 地址,然后它使用原始主机名作为主机头 - store.weareunited.com 向该 IP 地址发出请求。所以应该设置 Apache 来接收对主机名 store.weareunited.com 的请求。

PHP 不会关心主机名是什么,除非您正在检查诸如 $_SERVER 之类的环境变量...

您可以让您的客户为 joshstuart.com.au 设置 CNAME。您当然可以创建其他主机名,例如 weareunited.joshstuart.com.au,或者使用通配符,然后让您的客户将 CNAME 目标设置为该唯一主机名,但何必呢?我只会:

store.weareunited.com.  3600 IN CNAME   joshstuart.com.au.

只要 joshstuart.com.au 然后将 IP 地址分发给您的 Web 服务器,CNAME 就可以工作。正如我上面提到的,Apache 将看到一个对 store.weareunited.com 的请求,因此您需要为该主机名设置一个虚拟主机,或者像伯克利提到的那样创建一个通用虚拟主机(尽管我不确定 apache 是什么您将用来确保请求被映射到域的正确文件的指令......)。

于 2011-03-10T07:35:27.623 回答