如何使用Cake PHP创建子域?

时间:2011-07-19 09:05:54

标签: php cakephp dns subdomain

我正在构建一个站点,该站点需要为每个配置文件提供唯一的子域。我使用的技术是Cake PHP + MongoDB。我需要知道同样的可行性。我是否可以创建物理DNS,或者我可以通过Cake PHP中的Routes Class来简单地路由用户的Profile页面。请提出一些更好,更简单的实施方法以及相同的可行性。

先谢谢。

4 个答案:

答案 0 :(得分:5)

如果您为每个网站使用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()));
        }
    }
}

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

希望这有帮助。

答案 1 :(得分:1)

这很容易实现!只需要一点脚本和托管配置即可:

我们假设,暂时忽略子域名,您可以访问yoursite.com/users/view/id上的用户配置文件 - 标准惯例。

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

现在烦人的一点 - 在服务器上你的应用程序需要读取/写入服务器配置文件夹的权限,加上服务器也需要重新启动以获得新的conf文件 - 我的系统管理员技能只到目前为止你还会必须找出;通过运行bash脚本或其他方法来了解如何让服务器读取新的conf文件而不让它重新启动。

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

答案 2 :(得分:0)

简而言之:

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

<强>长:

使用Cake PHP中的Routes类,您将无法获得所需的位置。 “路由”允许配置路径,但不会创建路径或子域。如上所述:你说的是两个不同的东西:Cake PHP的Routes Class =基于PHP的重写,subdomain =服务器的DNS配置。

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

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

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

但我只能给你一个很好的建议:在开始走这条路之前要三思而后行。对于您和您的用户来说,它可能会变得过于坎坷,然后您会浪费宝贵的时间来更好地投入更多的选择。此外,一个体面的目录结构有什么问题?你知道,众所周知,搜索引擎比子域设置更喜欢不错的目录结构,因为当所有数据都与单个网站相关时,目录结构更具逻辑性。即使该网站是一个大的...像Facebook或Twitter。 ;)

答案 3 :(得分: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

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