2010-03-23 1041 views
11

En mi bootstrap.php Tengo el siguiente:Kohana3: Diferentes RewriteBase .htaccess y kohana base_url de entorno de desarrollo y producción

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

En .htaccess tienen esto:

# Installation directory 
RewriteBase /kohana/ 

Esto significa que si sólo cargue mi aplicación Kohana, se romperá porque RewriteBase en el archivo .htaccess estará equivocado. ¿Hay alguna manera de que pueda tener un condicional en el archivo .htaccess similar al que tengo en el programa de arranque para que use el RewriteBase correcto?

Respuesta

9

No creo que haya una manera de tener un RewriteBase condicional. La única forma en que Apache se me ocurre es colocar la directiva RewriteBase en una etiqueta <Location>, pero solo está disponible en httpd.conf, no en archivos .htaccess.

Lo que suelo hacer en estos casos es definir un AccessFileName diferente en el entorno local, por ejemplo htaccess.txt. Ese archivo contendrá las reglas de reescritura locales, mientras que .htaccess contiene las del lado del servidor.

+0

Inteligente ese último allí ... ¿Configuro AccessFileName en el httpd.conf? ¿Puedo configurarlos por host virtual también? – Svish

+0

@Svish según el manual, sí. –

+6

AccessFileName en realidad admite más de un nombre de archivo, por lo que podría agregar lo siguiente: 'AccessFileName local.htaccess .htaccess' y los archivos regulares .htaccess seguirían funcionando :) – Svish

5

Me encontré con esto mientras buscaba una solución similar. Si bien no obtuve RewriteBase para establecer condicionalmente, obtuve un efecto similar al establecer una variable de entorno y usarla en las siguientes reglas. Aquí hay un ejemplo de lo que quiero decir.

# 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

Interesante ... no estoy seguro de que obtenga lo que sucede allí: p – Svish

+0

Bueno, el directorio base que normalmente establecería RewriteBase para obtener se guarda en una variable de entorno ($ REWRITEBASE). En RewriteCond y RewriteRule, esa variable se expande y se le agrega un prefijo al resultado. Por ejemplo, si el server_name es localhost, RewriteRule se convierte en. * /local_dir/index.php$0 [PT]. – mozillalives

+0

Debo señalar también que esto está en Apache 2.2. No estoy seguro de cómo las versiones anteriores manejarían esto. – mozillalives

2

Si el archivo .htaccess está en la base de instalación (es decir, junto a index.php), entonces no es particularmente necesario RewriteBase, lo dejo fuera de mis aplicaciones y funcionan muy bien. Incluso con dos instalaciones Kohana, una dentro del otro directorio.

Cuestiones relacionadas