如何在ColdFusion中基于域或子域在同一代码库上运行多个站点

如何在ColdFusion中基于域或子域在同一代码库上运行多个站点,coldfusion,multiple-domains,Coldfusion,Multiple Domains,我有一个ColdFusion应用程序。我希望能够对多个域或子域运行相同的代码库(而不是复制它)。每个网站本质上都是一样的,只是它们会被打上品牌、剥皮、有不同的标题等等 所以,我要寻找的是如何让:www.abc.com、www.xyz.com和beta.mycompany.com都运行在相同的代码基础上。理想情况下,随着新客户的登录,可以快速添加新域 我已经在PHP和Rails中看到了这个问题,但没有看到CF。下面是我的想法(它似乎有效),但我想知道是否会有性能问题或更干净的建议 在应用中.CFC

我有一个ColdFusion应用程序。我希望能够对多个域或子域运行相同的代码库(而不是复制它)。每个网站本质上都是一样的,只是它们会被打上品牌、剥皮、有不同的标题等等

所以,我要寻找的是如何让:www.abc.com、www.xyz.com和beta.mycompany.com都运行在相同的代码基础上。理想情况下,随着新客户的登录,可以快速添加新域

我已经在PHP和Rails中看到了这个问题,但没有看到CF。下面是我的想法(它似乎有效),但我想知道是否会有性能问题或更干净的建议

在应用中.CFC



... 等
未配置此应用程序。

现在,只需将客户端id上的所有内容键入即可…

是的,这样就行了。我把它扔进我的应用程序中。我使用它为DEV和PROD设置不同的应用程序变量

Application.cfc:

     <CFIF not CGI.HTTP_HOST EQ "www.example.com" AND not CGI.HTTP_HOST EQ "example.com">
       <CFSET Application.Environment = "Dev">
       ...
     <CFELSE>
       <CFSET Application.Environment = "Prod">
       ...             
     </CFIF>
<cffunction name="OnApplicationStart">
  <cfset application.websites = structNew()>

  <cfquery name="sites">
    SELECT websiteID, url FROM websites
  </cfquery>

  <cfloop query="sites">
    <cfset application.websites["#url#"] = CreateObject("component", "websites").init(websiteID)>
  </cfloop>
</cffunction>

...
...             

应用程序实例基于application.name

因此,您只需以不同的方式命名每个实例

在application.cfc中,可以有这样的内容

<cfcomponent>

    <cfset this.name = replace(CGI.HTTP_HOST, '.', '', 'all') />


每个域现在都会产生不同的应用程序名称,从而产生不同的实例和应用程序变量集等。

我做了类似的事情,但我将所有信息保存在数据库中。这使得添加新网站更加容易,并且不需要对每个新客户端或模板进行任何代码更改

这是我的application.cfc代码:

     <CFIF not CGI.HTTP_HOST EQ "www.example.com" AND not CGI.HTTP_HOST EQ "example.com">
       <CFSET Application.Environment = "Dev">
       ...
     <CFELSE>
       <CFSET Application.Environment = "Prod">
       ...             
     </CFIF>
<cffunction name="OnApplicationStart">
  <cfset application.websites = structNew()>

  <cfquery name="sites">
    SELECT websiteID, url FROM websites
  </cfquery>

  <cfloop query="sites">
    <cfset application.websites["#url#"] = CreateObject("component", "websites").init(websiteID)>
  </cfloop>
</cffunction>

从网站中选择网站ID、url
现在我有一个网站的集合,应用程序被配置为响应。每个站点加载其模板。模板也保存在数据库中,因此每个站点都可以轻松配置为任何模板

对于每个请求,我们只需找到正确的网站:

<cffunction name="OnRequestStart">
  <cfargument name="targetPage">

  <cfif structKeyExists(application.websites, cgi.SERVER_NAME)>
    <cfset request.website= application.websites["#cgi.SERVER_NAME#"]>
  <cfelse>
    <cfabort>
  </cfif>

  <cfset request.template = request.website.template>
</cffunction>

现在每个请求都有网站和模板


我用它来运行3个电子商务网站和3个不同的模板从一个代码库和数据库

请记住,我可以编辑我的主机文件,使dev.example.com指向您的生产IP,您的服务器可能会认为它正在运行dev版本。请参阅这篇博客文章,了解我为什么使用CGI.HTTP_HOST而不是CGI.server_NAME好点,CF Jedi Master!在我的例子中,这可能不重要,但如果我运行某种代码,暴露dev中的敏感信息,或者有一个可以被利用的bug,这显然很重要。