2010-03-23 8 views
11

Nel mio bootstrap.php ho il seguente:Kohana3: Different RewriteBase .htaccess e kohana base_url per l'ambiente dev e la produzione

if($_SERVER['SERVER_NAME'] == 'localhost') 
    Kohana::$environment = 'development'; 
else 
    Kohana::$environment = 'production'; 

... 

switch(Kohana::$environment) 
{ 
    case 'development': 
     $settings = array('base_url' => '/kohana/', 'index_file' => FALSE); 
     break; 

    default: 
     $settings = array('base_url' => '/', 'index_file' => FALSE); 
     break; 
} 

In .htaccess hanno questo:

# Installation directory 
RewriteBase /kohana/ 

Questo significa che se ho appena carica la mia applicazione kohana, si romperà perché il RewriteBase nel file .htaccess avrà torto. C'è un modo per avere un condizionale nel file .htaccess simile a quello che ho nel bootstrap in modo che utilizzi il corretto RewriteBase?

risposta

9

Non penso che ci sia un modo per avere un condizionale RewriteBase. L'unico modo in cui Apache viene in mente è inserire la direttiva RewriteBase in un tag <Location> ma che è disponibile solo in httpd.conf stesso, non nei file .htaccess.

Ciò che di solito faccio in questi casi è definire un diverso AccessFileName nell'ambiente locale, ad esempio htaccess.txt. Quel file conterrà le regole locali di riscrittura, mentre .htaccess contiene quelle laterali del server.

+0

Clever quello ultimo lì ... Devo impostare AccessFileName in httpd.conf? Posso impostarli anche per host virtuale? – Svish

+0

@Svish in base al manuale, sì. –

+6

AccessFileName supporta effettivamente più di un nome di file, quindi potrei semplicemente aggiungere quanto segue: 'AccessFileName local.htaccess .htaccess' ei normali file .htaccess funzionerebbero comunque :) – Svish

5

Mi sono imbattuto in questo mentre cercavo una soluzione simile. Anche se non ho ottenuto RewriteBase per impostare condizionatamente, ho ottenuto un effetto simile impostando una variabile di ambiente e usando quella nelle seguenti regole. Ecco un esempio di cosa intendo.

# Set an environment variable based on the server name 
RewriteRule %{SERVER_NAME} localhost [E=REWRITEBASE:/local_dir/] 
RewriteRule %{SERVER_NAME} prodhost [E=REWRITEBASE:/prod_dir/] 

# Allow any files or directories that exist to be displayed directly 
RewriteCond %{ENV:REWRITEBASE}%{REQUEST_FILENAME} !-f 
RewriteCond %{ENV:REWRITEBASE}%{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^static 

# Rewrite all other URLs to index.php/URL 
RewriteRule .* %{ENV:REWRITEBASE}index.php/$0 [PT] 
+0

Interessante ... non sono sicuro di ottenere ciò che accade lì: p – Svish

+0

Beh, la directory di base che avrei normalmente impostato RewriteBase per essere salvata in una variabile di ambiente ($ REWRITEBASE). In RewriteCond e RewriteRule, quella variabile viene espansa e prefissa al risultato. Ad esempio, se il nome_server è localhost, RewriteRule diventa. * /local_dir/index.php$0 [PT]. – mozillalives

+0

Devo anche notare che questo è su Apache 2.2. Non sono sicuro di come le versioni precedenti avrebbero gestito questo. – mozillalives

2

Se il file .htaccess si trova nella base di installazione (cioè vicino al index.php), quindi non è particolarmente bisogno RewriteBase, lo lascio fuori delle mie applicazioni e funzionano in modo bello. Anche con due installazioni Kohana, una all'interno dell'altra directory.

Problemi correlati