如何使用Cake PHP创建子域名?

4
我正在构建一个网站,每个用户的资料需要一个唯一的子域名。我使用的技术是Cake PHP + MongoDB。我需要知道这是否可行。我是否可以创建物理DNS,或者是否可以通过Cake PHP中的路由类简单地路由用户的资料页面。请建议哪种方法更好、更容易实现,以及其可行性。
提前感谢您的帮助。

Nishant你好,我有同样的问题。你能发给我你的邮箱吗?我想和你讨论一下,或者可以通过电话或Skype进行讨论。希望看到你积极的回复。我来自昌迪加尔 :) - Naresh
4个回答

5
如果您使用CakePHP来创建每个网站,那么您不需要为每个站点创建多个子域名而担心,您可以简单地创建一个通配符DNS记录。这将从服务器和DNS管理中删除许多麻烦。
使用通配符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()));
        }
    }
}

*免责声明:以上代码是根据记忆输入的,可能无法直接通过复制/粘贴工作。

希望这能帮到你。


1

这很容易实现!只需要一点脚本编写和主机配置:

假设我们暂时忽略子域名,你可以在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 条目(不应硬编码)。 - Nishant Shrivastava
不幸的是,主机名(domain.com、sub.domain.com)需要在您的服务器上完成;那是DNS领域。上述方法允许您即时完成它 - 只有初始设置需要耗费时间,但那是您将要处理服务器配置的唯一时间;您的应用程序将处理其余部分。 - Shaz MJ

0
首先,子域名的创建与Cake、Mongo或PHP无关。这是一个DNS问题,您需要创建正确的DNS条目。例如:
subdomain1 IN CNAME domain.com.
subdomain1 IN A 123.2.33.45.

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

想象以下场景。创建了一个用户,但他将能够在 6 到 24 小时后访问其网页。您将不得不为此临时创建一些路径,并创建一个完整的方案,说明数据发生了什么以及链接指向何处等等。太复杂了。

Cake 的路由机制是一种辅助机制,可以使用内部逻辑将请求转换并解决到另一个路径。因此,它可以接受类似以下内容的东西:

yourwebsite.com/user/1

并将其转换为:

joe.yourwebsite.com

但是这个过程与子域的创建和维护无关。


e-sushi已经重写了他们最初错误的答案,哈哈。我怀疑这对OP来说是否仍然重要。 - Your Common Sense

0

简而言之:

使用Cake PHP自动创建子域名?很抱歉,这是行不通的。

详细解释:

使用Cake PHP的路由类("Routes")无法实现创建路径或子域名。"Routes"只允许配置路径,但它不能创建路径或子域名。因此,你需要明确两个不同的概念:Cake PHP的路由类=基于PHP的重写,子域名=DNS服务器的配置。

在考虑DNS之前,请注意新的DNS条目可能需要长达24小时才能生效。在新的(子)域名可以使用之前,它必须被传播到所有DNS服务器上。你确定这就是你想要的吗?这可能意味着(考虑用户注册)新用户可以注册,但无法使用或甚至无法访问他们的“新”子域名,因为它还没有被多个DNS服务器知道。

但是...如果等待时间不是问题,你可以尝试使通配符子域名起作用。但这严重依赖于你的Web托管提供商以及他们允许你做什么。如果有疑问,请联系他们(在了解通配符DNS的工作原理和是否真的需要使用它之后)。

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

但是我只能给你一个好建议:在开始这条路之前三思。这可能会对您和您的用户造成太多困难,然后您将浪费宝贵的时间,而这些时间本可以更好地用于研究替代方案。此外,一个体面的目录结构有什么问题吗?您知道,搜索引擎喜欢体面的目录结构,而不是子域设置,因为当所有数据与单个网站相关联时,目录结构更具逻辑性。即使那个网站很大...像Facebook或Twitter一样。 ;)


那么针对这个需求,你有什么建议呢?我们应该只使用一个专门的档案数据库,其中会提到数据库名称,通过它CakePHP将知道为哪个档案选择哪个数据库。这样可以吗? - Anupal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接