2014-03-25 76 views
1

我認爲我有一個奇怪/複雜的情況,但我認爲我忽視了一些簡單的事情。我們正在建立一個Yii應用程序,該應用程序將託管其他人創建的「皮膚」。它基本上是一個大社區,但在許多不同的網站上。一切都將由一個單一的通用核心Yii應用程序處理。許多社區站點的虛擬文檔根目錄

我們的計劃是讓這取決於皮膚的主人想要做兩個不同的URL配置:

1)whatever.theirsite.com(被設置爲CNAME到portal.oursite.com - 爲高級用戶)

2)portal.oursite.com/theircommunity - 爲那些誰只是希望它沒有其他配置

在第一種情況下工作,這是很容易挑出SERVER_NAME變量,擡頭數據庫中正確的主題,並提供正確的主題/社區。我在過去實際上已經完成了這項工作,並且工作正常。但是,我對第二種情況有點遺憾。我仍然可以通過db查找來找出portal.oursite.com/theircommunity提供的主題,但是所有路由都會因爲它們的社區不是控制器而被搞砸。它更像是一個虛擬目錄,但它的動態。我覺得我缺少一個簡單的htaccess或可能的UrlManager規則。

有效例如網址如下:

http://whatever.theirsite.com/mycontroller/myaction 
http://portal.oursite.com/theircommunity/mycontroller/myaction 

或模塊:

http://whatever.theirsite.com/mymodule/mycontroller/myaction 
http://portal.oursite.com/theircommunity/mymodule/mycontroller/myaction 

在所有情況下,兩對請求的需要去同一個地方。後端處理確保它們看起來不同,但是由相同的代碼處理。

有什麼建議嗎?

編輯: 我想到的一個解決方案,但尚未測試(不知道它是否是個好主意,或者它甚至可以工作)將擴展URL管理器以添加新的路由規則,具體取決於在哪個社區被要求。

例如:

  • 應用程序運行之前,做一個數據庫查找,以找出我們 正在使用的主題。

  • 如果主題使用虛擬根目錄,則複製所有現有的url管理器規則,但將它們的社區名稱附加到它們的前面。

回答

0

是的,我認爲你的編輯/ URL管理器設置可能是你最好的選擇。

值得一提的是,這些路由規則看起來與模塊路由規則類似,因此您可能可以使用應用行爲假裝載具有適當名稱的模塊。去年我爲客戶做了類似的事情;它工作,但很複雜。我建議你開始舒適地寫這個系統的單元測試,你會希望他們確保你不會在將來破壞事情:-)

0

有趣的問題!我可能會在這裏留下痕跡。但是會有這樣的工作嗎?

/portal.oursite.com 
    /theircommunity1/index.php 
    /theircommunity2/index.php 

言外之意:創建一個用戶特定的webroot子目錄。

這意味着用戶1將擁有/theircommunity1/index.php條目腳本。用戶2將有/theircommunity2/index.php。在進入腳本您可以

  1. 設置用戶特定的變量
  2. 包括「次要」入口腳本,可能是Web根目錄之外。
+0

我明白你的意思了。如果沒有其他選擇,這可以工作。我希望有一個更「優雅」的解決方案,不需要創建新的目錄。 – Eric

0

我不知道我是否正確理解你的情況。您可以擴展UrlManager並根據站點查找創建一些變量。例如$ _GET ['site'] ='theircommunity';並且可以稍後在應用程序中檢查此變量。

0

這實際上結束了一個簡單的解決方案,但它花了我一段時間才找到它。這只是擴展CHttpRequest並在init()中爲請求設置baseUrl屬性的問題。

if (Yii::app()->domainManager->isPortalDomain) { 
    // need to set the document root correctly 
    Yii::app()->request->baseUrl = '/' . Yii::app()->domainManager->domain->name; 
} 

當我這樣做,所有的路由工作和URL正確創建。