【问题标题】:Custom URL/Domain (CNAME alias?)自定义 URL/域(CNAME 别名?)
【发布时间】:2011-06-27 12:56:37
【问题描述】:

我正在 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 端做什么才能使其正常工作?

任何建议、链接或代码 sn-ps 将不胜感激。

谢谢


更新

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

【问题讨论】:

    标签: php dns lamp domain-name cname


    【解决方案1】:

    其实你什么都不用做。

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

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

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

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

    【讨论】:

    • 值得注意的是,从您的角度来看,@Josh,您将使用 wildcard DNS entry 代替 *.app.com,以避免每次添加顾客。但是对于用户自己的自定义地址,我和 Rami 在一起,这是他们的域,他们将使用 CNAME 或指向您实际服务器 IP 的 A 记录来管理它。
    • 感谢您的帮助。请原谅我的无知,但 cname 会像“转发器”或 url 别名一样。例如。 app.some_user.com/products 会像这样出现在地址栏中还是会转换为 some_user.app.com/products ?
    • 它将显示为 app.some_user.com/products,我猜这就是你想要的 :-)
    • 是的,这就是我想要的,但是我已经给了这个很好的机会,但似乎无法让它发挥作用。我什至设置了通配符 cname。
    【解决方案2】:

    我用 cpanel api2 做了类似的事情。

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

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

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

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

    【讨论】:

    • 这几乎是我所做的,除了我在主应用程序主机 (joshstuart.com.au) 上使用通配符条目和用户主机上的 CNAME 条目(用于测试 weareunified.com)。但是它没有正确解决。通过 http_host 进行的所有数据库端和站点识别都可以。你有这个 api 解决方案的链接/代码吗?
    • 关于api,cpanel网站上有一个实现它的类。但是,它有一个错误。 docs.cpanel.net/twiki/bin/view/AllDocumentation/…关于您的应用程序,每个用户是否都有一个目录或相同的脚本为他服务?您是否尝试将用户域与您的子域链接?如果是这样,那将不起作用,因为使用通配符,子域不是特定的,因此您不能将域指向未在 DN 中明确定义的子域。
    • 您最好的选择是使用域名停放,因为该域名随后会登陆您的网站并且您可以进行必要的检查。我假设您正在尝试获取该域已登陆的子域。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 其实我看到了我认为的问题。 ServerName cPanel102-469.hosting24.com.au DocumentRoot /usr/local/apache/htdocs 所以我应该把它指向我的 joshstuart.com.au 域的 docroot?
      • 是的,DocumentRoot 应该指向您的应用程序。此外,不要包含 ServerName 规范,因为它会侦听 CNAME 指向它的任何域,而不仅仅是 cPanel102-469.hosting24.com.au。
      • 感谢您的帮助!默认的虚拟主机让我望而却步。
      • 如果您使用dynamic vhost,您可以非常快速地进行设置,因此您可以为不同的客户提供来自不同目录的请求。在某些情况下,客户端使用相同应用程序的不同版本,客户端的特殊/专用托管,某些客户端的修改版本。
      • 啊,这很酷,需要牢记。目前我希望每个人都运行相同版本的应用程序。
      【解决方案5】:

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

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

      听起来您可能不了解 CNAME 的工作原理。一个过于简化的版本是,当用户请求 store.weareunited.com 时,他们的本地名称服务器(例如,在最终用户的 ISP 中的名称服务器。对于康卡斯特的我来说,它通常是比弗顿的康卡斯特 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 的请求,因此您需要为该主机名设置一个虚拟主机,或者像伯克利提到的那样创建一个通用虚拟主机(尽管我不确定 apache 是什么您将用来确保请求被映射到域的正确文件的指令......)。

      【讨论】:

      • 感谢您的解释。不幸的是,事实证明我在虚拟主机方面遇到了麻烦。
      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 2017-09-14
      • 2022-01-11
      • 2013-04-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2015-07-09
      相关资源
      最近更新 更多