【问题标题】:how to run multiple sites on same codebase in ColdFusion base on domain or subdomain如何在基于域或子域的 ColdFusion 中的同一代码库上运行多个站点
【发布时间】:2011-12-15 09:21:02
【问题描述】:

我有一个 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 的所有内容...

【问题讨论】:

    标签: coldfusion multiple-domains


    【解决方案1】:

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

    这是我来自 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 个不同的模板,来自一个代码库和数据库。

    【讨论】:

      【解决方案2】:

      应用程序实例基于 Application.name

      所以你只需对每个实例进行不同的命名

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

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

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

      【讨论】:

        【解决方案3】:

        是的,那会奏效。我把它扔到我的 Application.cfc 中。我用它来为 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>
        

        【讨论】:

        • 请记住,我可以编辑我的 HOSTS 文件,使 dev.example.com 指向您的生产 IP,而您的服务器可能认为它正在运行开发版本。
        • 查看这篇博文,了解我为什么使用 CGI.HTTP_HOST 而不是 CGI.SERVER_NAME n8williams.com/devblog/coldfusion/…
        • 好点,CF绝地大师!就我而言,这可能无关紧要,但如果我运行某种代码会暴露开发人员中的敏感信息(或存在可被利用的错误),这显然很重要。
        猜你喜欢
        • 2010-11-27
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 2012-03-18
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多