【问题标题】:Maintain the same project within multiple sub-domains在多个子域内维护同一个项目
【发布时间】:2018-12-23 06:28:36
【问题描述】:

我正面临一种情况,我想就最佳方法获得一些反馈/指导。

我有一个使用 PHP 和 CodeIgniter 开发的大型项目,作为 SaaS 解决方案工作了一年多,并且运行良好。大约两个月前,一位新客户问我他是否可以使用我的软件,但有一些专门为他开发的新功能。我答应了,并创建了一个子域,其中包含我主要项目的基本结构以及他要求的新开发。

现在发生的情况是,现在其他客户问我同样的问题,每当我在主项目中发现错误时,我都必须去两个子域项目并修复。如果错误涉及多个文件..这会花费我太多时间,并且可能会产生一些错误。

那么,我在这里要问的是,在为特定客户创建子域时,是否有比从主项目复制所有文件更好的解决方案?

我想过这个:

  1. 仅在子域中创建具有新功能的新文件/固定文件,并具有主项目的正确文件结构。
  2. .htaccess 以某种方式“重定向”到子域中的文件(如果存在)?

这可能吗?如果有,怎么做?

【问题讨论】:

  • 你在使用像 git 这样的 VCS 吗?
  • @Devon 我使用 git,但仅在个人模式下使用。每当我更改某些内容时,我都会提交以获取更改历史记录。
  • 这可能是一个很好的 git fork 用例
  • @Devon 怎么样?我的目标是停止克隆我的基础项目
  • 嗯,这就是你的 XY 问题解决方案,但我认为这不是一个理想的解决方案。除非您为此构建了广泛的插件系统,否则我认为 git fork 或单独的分支是处理此问题的最佳方法。您可以在您的主分支上创建错误修复并将它们合并到您的任何其他分支或分支。如果有任何冲突,您必须修复它们,但如果受影响文件中的代码相同,则更改将自动合并。

标签: php .htaccess codeigniter subdomain


【解决方案1】:

如果我理解正确,您需要 1 个源代码但在 2 个不同的域中输出。这是我用 Codeigniter 完成的,它依赖于 htaccess 的一个小功能,您可以使用 htaccess 设置 PHP 环境变量。这很有用,因为在 Codeigniter 中,您可以根据变量是否存在来改变不同视图或配置文件的路径。

您将需要单独的视图、配置、语言包和路由,但这绝对是可能的。例如在您的 htaccess 中:

SetEnv SITE_NAME "test.co.uk"

然后您需要设置不同的元素:

  1. 在 index.php(可能因版本而异)中切换取决于 SITE_NAME 变量的 URL
  2. 在 index.php 中更改视图文件夹(到您的版本特定视图)
  3. 按照此处的手册使用 ENVIRONMENT 设置更改您的配置变量:https://www.codeigniter.com/userguide3/libraries/config.html

这将允许您运行一组代码,但有两个前端。

【讨论】:

  • 嘿安东尼,请看看这个pastebin.com/AnvmJM0c,你认为环境变量会这样工作吗?
  • 很遗憾没有。 1 选项是区分路线 - 但这仍然将所有文件留在同一文件夹中。 2. 将区分整个应用程序文件夹,但这需要您的主控制器或客户控制器的副本。请记住,这可能变得不可行(因为您必须维护相同文件的多个副本)我认为更好的解决方案是创建不同的数据库表并在单个模型中更改表,而不是尝试区分控制器。如果你必须,那么我会建议一个文件夹,如 controllers/NAME/backend/Report.php 等
【解决方案2】:

这是可能的...但在不止一种方面具有明确的意义。

一个选项是使用像 GIT 这样的 VCS,如果它影响核心模块,则将更改推送到主分支,然后将提交合并到所有其他特殊分支。但这仍然涉及服务器上不同位置的相同文件。

您还可以考虑重构您的项目并构建一个核心模块,该模块用于每个项目并实现某种模块系统,以便自定义模块尽可能可插拔。然后,您可以从一个中心位置导入核心模块,并且只有针对每个客户的特定修改位于不同的位置。

但其中一种解决方案的决定很大程度上取决于您的项目结构以及客户的自定义部分如何影响其他模块和功能。

【讨论】:

  • 那么用户在子域登录然后.htaccess告诉用户是否应该在主域或子域上读取某些URL的解决方案是不可能的?跨度>
  • 据我所知 .htaccess 与 apache Web 服务器结合使用只会让您能够重写和重定向请求。如果您这样做,如果向您的父站点发出请求,您的用户将被注销,因为您的会话仅对您的子域有效。
  • 如果您使用数据库来存储客户数据,那么访问正确的数据库也会出现问题。如果您的子域只是重定向到您的主项目,您如何确保在数据库中写入该子域而不是主项目。
  • 数据库没问题,因为我的项目已经支持多数据库系统,每个订阅都有自己的数据库。
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2015-06-29
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2016-09-08
相关资源
最近更新 更多