2012-10-14 17 views
13

So che domande simili sono state poste prima ma non ho trovato risposte veramente specifiche per la mia situazione..htaccess in ambienti multipli

Ho un sito ExpressionEngine in esecuzione su più ambienti (locali, dev, produzione), e ciascuno di questi ambienti esigenze diverse regole .htaccess:

tutti gli ambienti

Sviluppo

  • Password Protect con .htpasswd protocollo
  • Forza HTTPS
  • Impedisci indicizzazione dei motori di ricerca con X-Robots-Tag

Produzione

  • Forza protocollo HTTPS
  • Redirect sottodomini non www a www

locali

  • Nessun regole uniche.

Ho visto molti esempi di come è possibile impostare specifici ambienti per modulo. Come RewriteCond %{REQUEST_HOST} ^dev.myurl.com per il modulo mod_rewrite e tricks like this per i requisiti di .htpasswd.

Ma quello che preferirei è un modo per impostare variabili di ambiente globali, quindi riutilizzare tali variabili nel file .htaccess per-environment. Per utilizzare pseudo-javascript come esempio, qualcosa come:

var local = 'mysite.local'; 
var development = 'dev.mysite.com'; 
var production = 'www.mysite.com'; 

// Global .htaccess rules 

if(environment == local){ 
    // Local environment .htaccess rules 
} 

if(environment == development){ 
    // Development environment .htaccess rules 
} 

if(environment == production){ 
    //Production envirotnment .htaccess rules 
} 

In questo modo tutte le regole specifiche per l'ambiente sono tutti raggruppati insieme, facendo un file veramente pulito, e solo una variabile deve essere cambiato se un ambiente è cambiato.

Ho visto alcuni riferimenti alla modifica delle impostazioni nei file di configurazione di Apache, ma ovviamente non è un'opzione valida se ho a che fare con host di terze parti.

Quindi, questa pie-in-the-sky è un pio desiderio o può essere fatto?

+0

mi sono imbattuto in [questo articolo] (http://www.thenerdary.net/post/20965499862/htaccess-environments), che non ho ancora provato ma sembra promettente. – kgrote

risposta

8

Quindi, questa pie-in-the-sky è un pio desiderio o può essere fatto?

IMO, sì. Non sarai mai in grado di ottenere "scope" prevedibili di regole basate su variabili ENV o qualcosa del genere.Non esiste arbitrario if(something) { do everything in here } in Apache. Molte direttive non funzioneranno all'interno di determinati ambiti e in seguito, quando è necessario modificare il modo in cui qualcosa funziona, è più probabile che si interrompa quello che si ha semplicemente modificandolo.

Il modo migliore è quello di not use htaccess files at all:

Si dovrebbe evitare di utilizzare .htaccess file completamente se si ha accesso ad httpd file principale di configurazione del server. L'uso dei file .htaccess rallenta il server HTTP Apache. Qualsiasi direttiva che è possibile includere in un file .htaccess è meglio impostata in un blocco Directory, poiché avrà lo stesso effetto con prestazioni migliori.

Creare un vhost separato per locale, dev e produzione. Accendeteli o spegneteli secondo necessità, qualunque configurazione globale condividano, memorizzateli altrove (come in un file chiamato global.includes) e quindi usate la direttiva Include in tutti e 3 i vhost. Se è necessario applicare regole a directory specifiche, utilizzare il blocco <Directory> anziché i file htaccess.

Se si preferisce attaccare tutto dentro i file .htaccess, si potrebbe provare a mettere tutto in <IfDefine> blocks, è probabilmente la cosa più vicina si dovrà tua pseudo-codice nella sua interrogazione. In sostanza qualcosa del tipo:

# Global htaccess rules 
RewriteEngine On 
RewriteRule ^foo$ /bar [L] 

# Only local 
<IfDefine LocalInstance> 
    RewriteRule ^local/foo /bar [L] 
</IfDefine> 

# Only dev 
<IfDefine DevInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

# Only production 
<IfDefine ProductionInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

Poi, quando si inizia a apache, avresti bisogno di passare -DLocalInstance, -DDevInstance o -DProductionInstance come paramaeters riga di comando o utilizzando la direttiva Define (con un solo argomento) da qualche parte nella tua configurazione vhost . Non è garantito che funzioni in modo così fluido come dovrebbe, mi sono imbattuto in problemi inspiegabili con <IfDefine>, specialmente se cerchi di diventare troppo stravagante.

+2

In Apache HTTP Server v2.4 uno dei principali miglioramenti è: ', e le sezioni possono essere utilizzate per impostare la configurazione in base ai criteri per richiesta. Finché ciò che si desidera utilizzare supporta il contesto di directory. http://httpd.apache.org/docs/trunk/mod/core.html#if –

10

La risposta di Jon è buona. Sfortunatamente, non tutti gli host web ti permetteranno di controllare il parametro -D per l'avvio di Apache.

Ecco un modo per utilizzare un unico file .htaccess sul dev e la produzione, ma hanno solo la password sito dev protetto:

# ---------------------------------------------------------------------- 
# Password protect staging server 
# Use one .htaccess file across multiple environments 
# (e.g. local, dev, staging, production) 
# but only password protect a specific environment. 
# ---------------------------------------------------------------------- 

SetEnvIf Host staging.domain.com passreq 
AuthType Basic 
AuthName "Password Required" 
AuthUserFile /full/path/to/.htpasswd 
Require valid-user 
Order allow,deny 
Allow from all 
Deny from env=passreq 
Satisfy any