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