【问题标题】:Virtual Document Root For Many Community Sites许多社区站点的虚拟文档根
【发布时间】:2014-03-25 15:30:55
【问题描述】:

我认为我的情况很奇怪/复杂,但我认为我忽略了一些简单的事情。我们正在设置一个 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 规则。

有效的示例网址是:

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 管理器规则,但将它们的communityname/ 附加到它们的前面。

【问题讨论】:

    标签: php apache yii document-root


    【解决方案1】:

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

    不管怎样,这些路由规则看起来与模块路由规则相似,因此您可能能够使用应用行为伪造加载具有适当名称的模块。去年我为客户做了类似的事情;它有效,但很复杂。我建议你开始适应这个系统编写单元测试,你会希望他们确保你将来不会破坏东西:-)

    【讨论】:

      【解决方案2】:

      有趣的问题!我在这里可能有点离谱。但是这样的事情会奏效吗?

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

      简而言之:为您的 webroot 创建一个用户特定的子目录。

      这意味着用户 1 将拥有/theircommunity1/index.php 入口脚本。用户 2 将拥有/theircommunity2/index.php。在入口脚本中你可以

      1. 设置用户特定变量
      2. 包括一个可能位于 webroot 之外的“辅助”入口脚本。

      【讨论】:

      • 我明白你在说什么。如果没有其他选择,那可能会奏效。我希望有一个不需要创建新目录的更“优雅”的解决方案。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-11-24
          • 2023-03-28
          • 1970-01-01
          • 2018-05-08
          • 2020-11-18
          • 2011-02-18
          • 1970-01-01
          • 2012-01-20
          • 1970-01-01
          相关资源
          最近更新 更多