我有一个ColdFusion应用程序。我希望能够针对多个域或子域运行相同的代码库(而不是复制它)。每个网站基本上是相同的,除了它们将被标记,剥皮并具有不同的标题等。
所以,我正在寻找的是如何:www.abc.com和www.xyz.com以及beta.mycompany.com都运行相同的代码库。理想情况下,当新客户登录时,可以快速添加新域名。
我已经看过PHP和Rails的这个问题,但不是CF.这就是我的想法(似乎有效),但想知道是否存在性能问题或更清晰的建议。
IN APPLICATION.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的所有内容......
答案 0 :(得分:4)
应用程序实例基于Application.name
所以你只需要用不同的方式命名每个实例
在application.cfc中你可以有这样的东西
<cfcomponent>
<cfset this.name = replace(CGI.HTTP_HOST, '.', '', 'all') />
现在,每个域都会生成不同的应用程序名称,从而分离实例和应用程序变量集等。
答案 1 :(得分: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个不同的模板来自一个代码库和数据库。
答案 2 :(得分:2)
是的,那会有用。我将它扔进我的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>