10

In my bootstrap.php I have the following:

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 .htaccesshave this:

# Installation directory
RewriteBase /kohana/

This means that if I just upload my kohana application, it will break because the RewriteBase in the .htaccess file will be wrong. Is there a way I can have a conditional in the .htaccess file similar to the one I have in the bootstrap so that it will use the correct RewriteBase?

Svish
  • 152,914
  • 173
  • 462
  • 620

3 Answers3

8

I don't think there is a way to have a conditional RewriteBase. The only way in Apache that comes to mind is putting the RewriteBase directive into a <Location> tag but that is only available in httpd.conf itself, not in .htaccess files.

What I usually do in such cases is define a different AccessFileName in the local environment, for example htaccess.txt. That file will contain the local rewrite rules, while .htaccess contains the server side ones.

Pekka
  • 442,112
  • 142
  • 972
  • 1,088
  • Clever that last one there... Do I set the AccessFileName in the httpd.conf? Can I set them per virtual host too? – Svish Mar 23 '10 at 17:07
  • 6
    AccessFileName actually supports more than one filename, so I could just add the following: `AccessFileName local.htaccess .htaccess` and regular .htaccess files would still work :) – Svish Mar 23 '10 at 19:45
5

I ran across this while looking for a similar solution. While I didn't get RewriteBase to set conditionally, I did get a similar effect by setting an environment variable and using that in the following rules. Here's an example of what I mean.

# 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]
mozillalives
  • 1,460
  • 16
  • 26
  • Interesting... not sure I get what happens there though :p – Svish Apr 22 '10 at 07:25
  • Well the base directory that I would normally set RewriteBase to get's saved to an environment variable ($REWRITEBASE). In the RewriteCond and RewriteRule, that variable is expanded and prefixed to the result. For example - if the server_name is localhost, the RewriteRule becomes .* /local_dir/index.php$0 [PT]. – mozillalives Apr 22 '10 at 11:42
  • I should note too that this is on Apache 2.2. I'm not sure how earlier versions would handle this. – mozillalives Apr 22 '10 at 11:43
2

If your htaccess file is in the installation base (ie next to index.php), then you don't particularly need RewriteBase, i leave it out of my applications and they work beautifully. Even with two Kohana installs, one inside the other directory.