2010-08-02 97 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的回答),您將在請求到該子域時收到錯誤。