5

我有一个 ColdFusion 应用程序。我希望能够针对多个域或子域运行相同的代码库(而不是复制它)。每个站点基本上都是相同的,除了它们将被标记、皮肤和具有不同的标题等。

所以,我正在寻找的是如何拥有:www.abc.com 和 www.xyz.com 和 beta.mycompany.com 都运行相同的代码库。理想情况下,在新客户登录时添加新域会很快。

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

应用中.CFC


<cfif cgi.server_name EQ "www.abc.com"  >
    <cfset request.client_id=1>
<cfelseif cgi.server_name EQ "www.xyz.com">
    <cfset request.client_id=2>
... etc             
<cfelse>
    This application not configured.
    <cfabort>   
</cfif>

现在,只需关闭 client_id 的所有内容...

4

3 回答 3

4

应用程序实例基于 Application.name

所以你只需以不同的方式命名每个实例

在 application.cfc 你可以有这样的东西

<cfcomponent>

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

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

于 2011-10-26T04:39:57.900 回答
3

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

这是我来自 application.cfc 的代码:

<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>

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

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

<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 个不同模板的电子商务网站。

于 2011-10-26T13:56:12.867 回答
2

是的,那会奏效。我把它扔到我的 Application.cfc 中。我用它来为 DEV 和 PROD 设置不同的应用程序变量。

应用程序.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>
于 2011-10-26T01:30:56.383 回答