提前感谢您的帮助。
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()));
}
}
}
*免责声明:以上代码是根据记忆输入的,可能无法直接通过复制/粘贴工作。
希望这能帮到你。
这很容易实现!只需要一点脚本编写和主机配置:
假设我们暂时忽略子域名,你可以在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文件。
还要确保服务器文件在更改用户名或删除用户时进行更新。
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
但是这个过程与子域的创建和维护无关。
简而言之:
使用Cake PHP自动创建子域名?很抱歉,这是行不通的。
详细解释:
使用Cake PHP的路由类("Routes")无法实现创建路径或子域名。"Routes"只允许配置路径,但它不能创建路径或子域名。因此,你需要明确两个不同的概念:Cake PHP的路由类=基于PHP的重写,子域名=DNS服务器的配置。
在考虑DNS之前,请注意新的DNS条目可能需要长达24小时才能生效。在新的(子)域名可以使用之前,它必须被传播到所有DNS服务器上。你确定这就是你想要的吗?这可能意味着(考虑用户注册)新用户可以注册,但无法使用或甚至无法访问他们的“新”子域名,因为它还没有被多个DNS服务器知道。
但是...如果等待时间不是问题,你可以尝试使通配符子域名起作用。但这严重依赖于你的Web托管提供商以及他们允许你做什么。如果有疑问,请联系他们(在了解通配符DNS的工作原理和是否真的需要使用它之后)。
类似的问题和答案可以在这里找到:
但是我只能给你一个好建议:在开始这条路之前三思。这可能会对您和您的用户造成太多困难,然后您将浪费宝贵的时间,而这些时间本可以更好地用于研究替代方案。此外,一个体面的目录结构有什么问题吗?您知道,搜索引擎喜欢体面的目录结构,而不是子域设置,因为当所有数据与单个网站相关联时,目录结构更具逻辑性。即使那个网站很大...像Facebook或Twitter一样。 ;)