自定义URL /域(CNAME别名?)

时间:2011-02-15 11:18:04

标签: php dns lamp domain-name cname

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

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

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

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

我的问题是:

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

  2. 我需要做些什么来提供这个?即。我需要在DNS,apache和php方面做些什么来实现这个目的?

  3. 非常感谢任何建议,链接或代码片段。

    由于


    更新

    到目前为止,我已经能够设置通配符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.
    

5 个答案:

答案 0 :(得分:7)

我使用LAMP进行此设置,效果非常好。我是这样做的:

  1. 我的应用程序上的目标服务器位于正常的A记录(子)域上。因此,在您的情况下,我假设您已在 joshstuart.com.au 上运行该应用程序。
  2. 客户需要将 store.weareunified.com 的DNS条目更改为CNAME为 joshstuart.com.au。
  3. Apache服务器有一个没有域规范的虚拟主机(在我的例子中),只是一个<VirtualHost *:80>
  4. 就是这样。目前有70多个域名CNAME到主应用程序域,并且每个域都根据需要为其各自的站点提供服务(没有重定向等)。

答案 1 :(得分:5)

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

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

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

亚马逊为EC2服务器的用户推荐这种技术。

请注意,CNAME记录有一个限制,无法将其分配到域的根目录 - 您的用户无法指定http://some_user.com/,只能将http://app.some_user.com/指定为CNAME。

答案 2 :(得分:1)

我和cpanel api2有类似的东西。

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

当本地名称服务器获得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地址,CNAME就可以使用。正如我上面提到的,Apache会看到store.weareunited.com的请求,因此您需要为该主机名设置虚拟主机,或者像Berklee提到的那样创建一个通用虚拟主机(虽然我不确定是什么apache您将用于确保请求被映射到域的正确文件的指令...)。