2011-07-20 6 views
12

Sto lavorando a un'app che utilizza le riscritture url e ha una configurazione specifica .htaccess. Quando si lavora su App Ho tre eviorments:.htaccess tra developemt, staging e produzione

  1. developent sulla mia macchina locale (localhost)
  2. Staging (staging.mydomain.com)
  3. Production (www.mydomain.com)

Sto costantemente spingendo nuovi aggiornamenti all'ambiente di staging e produzione e ogni volta che sovrascrivo il codice sorgente esistente devo andare a modificare il file .htaccess. C'è un modo per utilizzare la .htaccess nella directory o far sì che rilevi automaticamente il suo ambiente?

Il mio file .htaccess corrente è in basso. Ho appena un-commento delle sezioni tra i diversi ambienti ma mi piacerebbe smettere di farlo ...

# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

Grazie in anticipo!

Chuck

+0

Perché i percorsi sono diversi, tuttavia /favicon.ico è lo stesso? –

+2

Avrei appena configurato host virtuali in modo da avere gli stessi URL in ogni ambiente. Quindi non è necessario modificare il .htaccess tra di loro. – Quentin

risposta

13
# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^localhost 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^staging.mydomain.com 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^www.mydomain.com 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 
+0

La variabile '% {REQUEST_HOST}' non aggiornata?Ho trovato l'equivalente '% {HTTP_HOST}' nella documentazione mod_rewrite. –

+0

@JohnnyWong, sì, sembra così: https://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond ha aggiornato la risposta con 'HTTP_HOST' var. Sentiti libero di modificare la risposta nel caso in cui trovi altri problemi, dal momento che non uso apache dal 2011, credo;) –

7

Una possibilità potrebbe essere quella di variabili d'ambiente di configurazione in httpd.conf (o altrove) che definiscono l'ambiente.

Per esempio (in httpd.conf):

SetEnv ENVIRONMENT production 

(in .htaccess)

RewriteEngine on 

# Development 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = development 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = staging 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = production 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

testato, ma penso che il concetto è abbastanza solida per capire eventuali problemi ;-)

+0

+1 Ottimo se hai accesso ad Apache conf perché puoi impostare l'ambiente indipendentemente da ciò che il L'URL è Rende lo sviluppo locale in cui si utilizza un URL diverso per i server ospitati molto più facilmente – Precastic

0

Chuck D, la variante di Dumitru Ceban è molto buona. Ma ti suggerisco di provare anche l'opzione per avere qualche bandiera nel tuo codice - non in .htacces.

Inoltre, buon suggerimento di rudi_visser. Ma voglio aggiungere qui, che nel sistema ideale dovremmo usare solo Apache`s * .conf e declinare .htaccess (solo una prestazione stupida).

Quindi ti suggerisco di avere qualche contrassegno nel codice, evitare .htacess (se puoi) e passare env. con un semplice valore di conf o con una logica come

+0

Oppure per il sistema ideale potremmo solo usare - *. Conf per la produzione. – gaRex

+0

Non penso che la prestazione di .htaccess sui sistemi moderni sia qualcosa di cui preoccuparsi più! Ma comunque non credo che mettere questa logica in codice possa aiutare in questa situazione a causa del fatto che Apache non saprà dove indirizzare comunque le richieste. –

+0

@rudi_visser, non sono sicuro, che .htaccess sia adeguato alla produzione. E PHP potrebbe sapere dove passare la logica all'interno del tuo framework: quale connessione DB di tmp/path utilizzare. – gaRex

1

Non puoi semplicemente inserire i tuoi file .htaccess in ciascuno degli ambienti, e quindi semplicemente ignorare il file in qualsiasi FTP o programma di distribuzione che stai utilizzando?

Alternativa, ciò che faccio è impostare VirtualHosts nel mio host locale che è lo stesso dominio del sito di produzione, ma con un prefisso dev.. Ad esempio, www.example.com e dev.example.com. In questo modo, posso sempre essere certo che la root sia la directory di livello superiore di qualsiasi host che sto usando, indipendentemente dall'ambiente; e non ho bisogno di riscrivere le mie direttive .htaccess.