许多社区站点的虚拟文档根


Virtual Document Root For Many Community Sites

我想我有一个奇怪/复杂的情况,但我想我忽视了一些简单的东西。我们正在建立一个Yii应用程序,将托管其他"皮肤"的人设置。它基本上是一个大社区,但在许多不同的网站上。一切都将由一个通用核心的Yii应用程序处理。

我们的计划是允许两种不同的URL配置,这取决于皮肤所有者想要做什么:

1) whatever.theirsite.com(设置为portal.oursite.com的CNAME -对于高级用户)

2) portal.oursite.com/theircommunity -对于那些只想让它在没有其他配置的情况下工作的人

在第一种情况下,很容易挑选出SERVER_NAME变量,在数据库中查找正确的主题,并提供正确的主题/社区。我以前就这么做过,效果很好。然而,我对第二个案例有点困惑。我仍然可以做db查找,找出什么主题服务portal.oursite.com/theircommunity,但所有的路由搞砸了,因为他们的社区不是一个控制器。它更像是一个虚拟目录,但它是动态的。我觉得我错过了一个简单的htaccess或可能的UrlManager规则。

有效的url示例如下:

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管理器,根据请求的社区添加新的路由规则。

,

  • 在应用程序运行之前,执行db查找以确定我们使用的是哪个主题使用。

  • 如果主题使用虚拟根,则复制所有现有的url管理器规则,但在它们的前面附加他们的communityname/

是的,我认为你的编辑/URL管理器设置可能是你最好的选择。

无论如何,这些路由规则看起来与模块路由规则相似,所以你可以使用应用行为来加载一个具有适当名称的模块。去年我为一位客户做过类似的事情;它起作用了,但很复杂。我建议你开始适应针对这个系统编写单元测试,你会希望他们确保你将来不会破坏东西:-)

有趣的问题!我可能大错特错了。但是这样的东西有用吗?

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

换句话说:在你的webroot中创建一个用户特定的子目录。

这意味着用户1将拥有/theircommunity1/index.php条目脚本。用户2有/theircommunity2/index.php。在条目脚本中,您可以

  1. 设置用户特定变量
  2. 包含一个'secondary'入口脚本,它可能在webroot之外。

我不确定我是否正确理解了你的场景。您可以扩展UrlManager并根据站点查找创建一些变量。例如$_GET['site'] = '他们的社区';您可以稍后在应用程序中检查这个变量。

这实际上最终有一个简单的解决方案,但我花了一段时间才找到它。这只是扩展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被正确创建。