我正在使用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访问注册/登录/其他控制器和操作。
非常感谢任何建议!
谢谢!
答案 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.com
和http://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的回答),您将收到对该子域的请求的错误。