2011-10-26 11 views
5

Tengo una aplicación ColdFusion. Me gustaría poder ejecutar la misma base de código (en lugar de duplicarla) en múltiples dominios o subdominios. Cada uno de los sitios sería esencialmente el mismo, excepto que serían marcados, despellejados y con diferentes títulos, etc.cómo ejecutar varios sitios en la misma base de código en la base de ColdFusion en el dominio o subdominio

Así que, lo que estoy buscando es cómo tener: www.abc.com y www. xyz.com y beta.mycompany.com todos ejecutando la misma base de código. Idealmente, será rápido agregar nuevos dominios a medida que nuevos clientes inicien sesión.

He visto esta pregunta para PHP y Rails, pero no para CF. Esto es lo que estaba pensando (y parece que funciona), pero me preguntaba si habría problemas de rendimiento o una sugerencia más clara.

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

Ahora, sólo clave de todo lo que fuera ... client_id

Respuesta

2

Sí, eso funcionaría. Lo lanzo en mi Application.cfc. Lo usé para establecer diferentes variables de aplicación para DEV y 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> 
+2

Solo tenga en cuenta que puedo editar mi archivo HOSTS de tal manera que dev.example.com apunta a su IP de producción y su servidor puede pensar que está ejecutando la versión dev. –

+0

Vea esta publicación de blog sobre por qué uso CGI.HTTP_HOST en lugar de CGI.SERVER_NAME http: //www.n8williams.com/devblog/coldfusion/get-the-domain-entered-from-the-request – speeves

+0

¡Buen punto, CF Jedi Master! En mi caso, probablemente no importe, pero obviamente importaría si estuviera ejecutando algún tipo de código que expone información sensible en dev (o tiene un error que puede ser explotado. – speeves

4

La instancia de la aplicación se basa en la Application.name

por lo que sólo un nombre a cada instancia diferente

En Application.cfc que puede tener algo como esto

<cfcomponent> 

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

Cada dominio ahora causa una diferencia nt nombre de la aplicación, por lo tanto, instancia separada y conjuntos de variables de aplicación, etc.

3

Hago algo similar, pero guardo toda la información en una base de datos. Eso hace que sea mucho más fácil agregar nuevos sitios web y no requiere ningún cambio de código para cada nuevo cliente o plantilla.

Heres mi código de 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> 

ahora tengo una colección de sitios web de la aplicación está configurada para responder a. Cada sitio carga su plantilla. Las plantillas también se guardan en la base de datos, por lo que cada sitio puede configurarse fácilmente en cualquier plantilla.

Para cada solicitud, sólo tenemos que encontrar el sitio web correcta:

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

Ahora cada solicitud tiene la página web y plantilla disponible througout.

Utilizo esto para ejecutar 3 sitios de comercio electrónico con 3 plantillas diferentes de una base de código y base de datos.

Cuestiones relacionadas