2010-08-02 96 views
5

我使用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/user/register。而且这种行为对我所有的控制器都是一样的。

我意识到一切工作正常,但是如何将www.website.com和compnay.website.com的控制器分开?我不希望用户访问subdomian url中的注册/登录/其他控制器和操作。

任何建议都非常感谢!

谢谢!

回答

4

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

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

,并在您other/route行动检查company参数。请注意,这些规则的工作需要http://。有关更多详细信息,请参阅CUrlManager文档。

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

+0

嗨,我知道这是一个很老的线程,但它不想为我工作。我必须更改我的'vhosts'文件或windows(Apache)上的'hosts'文件的设置吗? – Sthe 2012-09-09 06:58:55

2

如果我理解你的问题,那么URL中的“公司”部分就是一个可变的公司名称。我会在这个假设下继续回答。

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

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 
), 

“本公司”字符串将被传递给应用程序,$ _GET [“公司”],你可以使用这个参数在CompaniesModule.php文件加载一些公司的具体数据。

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