【问题标题】:How to create Sub Domains using Cake PHP?如何使用 Cake PHP 创建子域?
【发布时间】:2011-10-08 08:29:06
【问题描述】:

我正在构建一个站点,它需要每个配置文件都有一个唯一的子域。我使用的技术是 Cake PHP + MongoDB。我需要知道相同的可行性。借助 Cake PHP 中的 Routes 类,我是否可以创建物理 DNS,或者我可以简单地路由 User 的 Profile 页面。请提出更好、更简单的实施方法以及相同的可行性。

提前致谢。

【问题讨论】:

  • Nishant 你好,我有同样的问题。你能把你的邮件ID发给我吗?我想和你讨论或者可以通过电话或Skype讨论。希望看到你积极的答复。我来自昌迪加尔 :)

标签: php cakephp dns subdomain


【解决方案1】:

如果您对每个网站都使用 CakePHP,则无需担心为每个网站创建多个子域,您只需创建通配符 DNS 记录即可。这为服务器和 DNS 管理省去了很多麻烦。

Wild-Card DNS Record(Wiki)

有了通配符 DNS 记录,您就可以使用 HTTP_HOST 或 CakePHP 方式 $request->host() 来确定用于访问您的系统的主机名(子域)。然后,您可以在 AppController 的 beforeFilter() 方法中加载正确的配置文件详细信息并从那里继续前进。

我做一些类似的事情:

class User extends AppModel
{
     public $belongsTo = array(
          'Profile'
     );

     public function findByProfileHostname($hostname) {
         return $this->find('first', array('conditions' => array(
             'Profile.hostname' => $hostname
         ));
     }
};

class AppController extends Controller
{
    public function beforeFilter () {
        $this->ActiveUser = $this->User->findByProfileHostname($this->request->host());
        if (!$this->ActiveUser) {
            throw new InvalidArgumentsException(__('%s is not active here', $this->request->host()));
        }
    }
}

*免责声明:以上代码是从内存中输入的,可能无法直接通过复制/粘贴。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这很容易做到!只需要一点脚本和托管配置:

    假设现在忽略子域,您可以访问 yoursite.com/users/view/id 上的用户配置文件 - 标准约定。

    然后我们需要做的就是将 username.yoursite.com 映射到正确的 yoursite.com/users/view/id - 这应该在用户注册的任何时候发生。所以在 users/add - 我们需要编写一个脚本来访问你的服务器'users'/'sites-available'(或等效) - 并附加到已经存在的'yoursite.com'配置的末尾,或者每次用户注册时创建新的“username.yoursite.com”。

    现在烦人的一点 - 在服务器上,您的应用程序需要读取/写入服务器配置文件夹的权限,此外还需要重新启动服务器以获取新的 conf 文件 - 我的系统管理员技能仅此而已,您将必须找出;通过运行 bash 脚本或其他有关如何让服务器读取新的 conf 文件而无需重新启动的方法。

    如果用户名更改或用户被删除,还要确保服务器文件更新。

    【讨论】:

    • 没有帮助我。我试图让它摆脱所有东西。不依赖于任何自定义 A 条目(不应该被硬编码)。
    • 不幸的是,主机名(domain.com、sub.domain.com)需要在您的服务器上完成;那是 DNS 领域。上述方法允许您即时进行 - 只是初始设置很耗时,但这是您唯一一次搞乱服务器配置;你的应用会处理剩下的事情。
    【解决方案3】:

    首先。 子域的创建与 Cake、Mongo 或 PHP 无关。这是 DNS 问题,您需要创建正确的 DNS 条目。例如:

    subdomain1 IN CNAME domain.com.
    subdomain1 IN A 123.2.33.45.
    

    正如@e-sushi 指出的那样,这需要时间。您可以自动化此过程,但不是使用 PHP,而是使用 root 访问权限(您实际上可以在 PHP 中使用 shell_exec 执行此操作,但这是另一回事)。根据您的托管,这在时间上实际上可能非常复杂且不可靠。

    想象一下下面的场景。创建了一个用户,但他将能够在 6 到 24 小时后访问网页。您将不得不暂时创建一些临时路径,并创建一个完整的场景,其中包含数据发生的情况以及链接指向的方式......等等。太复杂了。

    Cake 的路由机制是一种辅助机制,可以使用内部逻辑将请求转换并解决到另一个路径。所以它可能需要这样的东西:

    yourwebsite.com/user/1
    

    并将其转换为:

    joe.yourwebsite.com
    

    但是这个过程独立于子域的创建和维护。

    【讨论】:

    • e-sushi aready 重写了他们最初的错误答案,哈哈。我怀疑它仍然对 OP 很重要
    【解决方案4】:

    简而言之:

    使用 Cake PHP 自动创建子域?对不起,但这行不通。

    更长:

    使用 Cake PHP 中的 Routes 类将无法到达您想去的地方。 “路由”允许配置路径,但不会创建路径或子域。如前所述:您说的是两件不同的事情:Cake PHP 的路由类 = 基于 PHP 的重写,子域 = 服务器的 DNS 配置。

    在您浪费时间考虑 DNS 之前,请注意新的 DNS 条目可能需要长达 24 小时才能启动。在可以使用新的(子)域之前,必须对其进行传播。你确定那是你想要的吗?这可能意味着(考虑用户注册)新用户可以注册但不能使用甚至无法访问他们的“新”子域,因为几个 DNS 服务器还不知道它。

    但是...如果等待时间对您来说没有问题,您可以尝试使通配符子域工作。但这在很大程度上取决于您的网络托管服务提供商以及他们允许您做什么。如有疑问,请联系他们(在您了解通配符 DNS 的作用以及如果您真的想使用它之后)。

    类似的问题和答案可以在这里找到:

    但我只能给你一个很好的提示:在开始走这条路之前要三思而后行。对于您和您的用户而言,这可能会变得过于坎坷,然后您将浪费宝贵的时间,您本可以更好地投资于制定替代选项。此外,一个像样的目录结构有什么问题?您知道,众所周知,搜索引擎比子域设置更喜欢体面的目录结构,因为当所有数据都与单个网站相关时,目录结构更具逻辑性。即使那个网站很大……比如 Facebook 或 Twitter。 ;)

    【讨论】:

    • 那么你对这个要求有什么建议呢?我们是否应该只为需要提及数据库名称的配置文件创建一个单独的数据库,通过该数据库,CakePHP 将知道为哪个配置文件选择哪个数据库。没事吧?
    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2010-10-09
    • 2016-04-18
    • 2020-02-11
    相关资源
    最近更新 更多