2011-10-26 9 views
5

Ho un'applicazione ColdFusion. Mi piacerebbe essere in grado di eseguire lo stesso codice base (anziché duplicarlo) su più domini o sottodomini. Ciascuno dei siti sarebbe essenzialmente lo stesso, tranne che sarebbe marchiato, scorticato e con titoli diversi, ecc.come eseguire più siti sulla stessa base di codice in ColdFusion base su dominio o sottodominio

Quindi, quello che sto cercando è come avere: www.abc.com e www. xyz.com e beta.mycompany.com che eseguono tutti la stessa base di codice. Idealmente, sarà rapido aggiungere nuovi domini mentre i nuovi clienti si collegano.

Ho visto questa domanda per PHP e Rails, ma non CF. Ecco cosa stavo pensando (e sembra funzionare), ma mi chiedevo se ci sarebbero stati problemi di prestazioni o un suggerimento più pulito.

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> 

Ora, proprio tutto chiave fuori client_id ...

risposta

2

Sì, che avrebbe funzionato. Lo butto nel mio Application.cfc. L'ho usato per impostare diverse variabili Application per DEV e 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

Ricorda che posso modificare il mio file HOSTS in modo che dev.example.com punti all'IP di produzione e il tuo server potrebbe pensare che stia eseguendo la versione di sviluppo. –

+0

Vedere questo post sul blog perché utilizzo CGI.HTTP_HOST anziché CGI.SERVER_NAME http: //www.n8williams.com/devblog/coldfusion/get-the-domain-immesso-dalla-richiesta – speeves

+0

Buon punto, CF Jedi Master! Nel mio caso, probabilmente non ha importanza, ma ovviamente importa se stavo eseguendo una sorta di codice che espone informazioni sensibili in dev, (o ha un bug che può essere sfruttato. – speeves

4

L'istanza applicazione si basa sul Application.name

quindi basta il nome ogni istanza in modo diverso

In Application.cfc si può avere qualcosa di simile

<cfcomponent> 

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

Ogni dominio ora causa una differenza nt nome dell'applicazione, quindi istanza separata e set di variabili applicative ecc.

3

Faccio qualcosa di simile, ma tengo tutte le informazioni in un database. Ciò rende molto più semplice aggiungere nuovi siti Web e non richiede modifiche al codice per ogni nuovo client o modello.

Heres il mio codice da 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> 

Ora ho una collezione di siti web l'applicazione è configurata per rispondere a. Ogni sito carica il suo modello. I modelli vengono anche salvati nel database, quindi ogni sito può essere facilmente configurato su qualsiasi modello.

Per ogni richiesta, abbiamo solo bisogno di trovare il sito corretto:

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

Ora ogni richiesta ha il sito web e il modello disponibile througout.

Sono in uso per eseguire 3 siti di e-commerce con 3 modelli diversi su un base di codice e un database.