动态创建子域

时间:2010-08-02 18:13:24

标签: yii wildcard-subdomain

我正在使用MVC框架(Yii)创建一个网站,我需要动态创建子域名,即 http://company.website.com

所以,为了实现这一点,我添加了一个DNS通配符(* .website.com)。现在问题是我的应用程序控制器对于www.website.com和company.website.com来说都是一样的。例如,我有一个User控制器Register操作(user/register)。现在,如果我去 www.website.com/user/register ,我可以注册,但如果我去 company.website,我可以完全。 COM /用户/注册即可。对于我的所有控制器,这种行为都是一样的。

我意识到一切正常,但我如何为www.website.com和compnay.website.com分离控制器?我不希望用户从子网站URL访问注册/登录/其他控制器和操作。

非常感谢任何建议!

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以在路由规则数组中包含主机名。例如,您可以创建规则

array(
    'http://www.website.com/user/register' => 'user/register',
    'http://<company:\w+>.website.com/user/register' => 'other/route',
)

并检查company操作中的other/route参数。请注意,这些规则必须http://才能生效。有关详细信息,请参阅CUrlManager文档。

P.S。如果http://www.website.comhttp://company.website.com/user/register的控制器完全不同,那么为这些网站设置两个应用程序可能会更好。

答案 1 :(得分:2)

如果我理解您的问题,则URL的“公司”组件是可变公司名称。我会在这个假设下继续我的回答。

另一种选择是创建公司模块(我现在称之为“公司”),并使用CUrlManager规则路由到该控制器。 E.g。

array(
    'http://<company:\w+>.website.com/user/register' => '/companies/user/register',
    'http://<company:\w+>.website.com/<_c:\w+>/<_a:\w+>' => '/companies/<_c>/<_a>' // more generic option
),

'company'字符串将作为$ _GET ['company']传递给应用程序,您可以在CompaniesModule.php文件中使用此参数来加载某些公司特定数据。

请注意,如果没有其他规则来处理www.website.com请求(根据Gray Teardrop的回答),您将收到对该子域的请求的错误。