Question

I can't get it work this part of .htaccess, the IfDefine never runs. What am I doing wrong, setenvif mod is enabled.

RewriteBase /

SetEnvIf HTTP_HOST ^localhost$ local
<IfDefine local>
  RewriteBase /codeigniter-app/
</IfDefine>

SetEnvIf HTTP_HOST ^testing.alex.com$ testing
<IfDefine testing>
    RewriteBase /app/
</IfDefine>

This is based on: With mod_rewrite can I specify a RewriteBase within a RewriteCond?

Edit: Any other way to accomplish the above?

Was it helpful?

Solution

My answer if that Apache doesn't allow you to do what you are trying to do here, but that's because AFAIK you don't need to do this to do what you really need to do.

It seems as if you are trying to create a local environment that in configuration terms mirrors your (remote) server-based test environment. However you are confusing the URI namespace and the file system namespace and in Apache Server these are quite different. For example the <Location> directive operates on the former and the <Directory> directive operates on the latter. .htaccess sort of cut across both so you need to understand when a parameter operates on one or the other.

For example, I have a shared service account which service a number of subdomains *.ellisons.org.uk -- for example my blog is on http://blog.ellisons.org.uk/. I develop on an Ubuntu laptop and a VM that mirrors the LAMP/suPHP configuration that my service provider operates (but I have root access and can see the rewrite logs, etc. on the VM) I statically allocate IP addresses in my 192.168.1.0/24 private address space and have /etc/hosts symonyms for

127.0.1.1      ... blog.ellisons.org.home forum.ellisons.org.home ...
192.168.1.250  ... blog.ellisons.org.vm ...

But other than this the URI space is identical,so blog.ellisons.org.XX/themes/terry/all.css loads my css from my server,laptop or VM depending on whether XX=uk,home,vm

However the docroot on my laptop is Debian standard /var/www, but on the other two it is /websites/LinuxPackage02/el/li/so/ellisons.org.uk/public_html (my hosters naming convention). Yet my application including .htaccess files is identical, and the only way that these reflect this multiple use is in regexps where I using as a regexp to match %{HTTP_HOST} (\w+)\.ellisons.\org\.(?:uk|home|vm).

So to your example:

  • There's nothing to stop you pointing the requests to /app to your physical directory /codeigniter-app on your local PC. You can use an Alias directive in your server or vhost config to do this..
  • RewriteBase takes a URI path argument so /app would work in both.
  • In general Apache understands the difference between URI and FS domains and doesn't get confused -- even your developers regularly do :-) On the rare occasions that you need to refer explicitly to a FS name, say in a RewriteCond string, you can use %{DOCUMENT_ROOT} -- though if your service is a shared service you may have to use an environment variable instead (mine is %{ENV:DOCUMENT_ROOT_REAL}). I phpinfo() will tell you which.
  • Make sure that you use relative addresses in any RewriteRule substitutions (no leading slashes).

So to summarise, with a little bit of thought you can make your configurations logically identical as Apache offers -- isn't that better than trying to botch in conditional execution in a way that was never designed into the product?

OTHER TIPS

SetEnvIf works on request headers. So you want to use HOST not HTTP_HOST. E.g.

SetEnvIf HOST ^localhost$ local

SetEnvIf sets an environment variable. It doesn't define a new constant for Apache to use.

See the SetEnvIf manual and compare it to <IfDefine> manual.

You also need to make sure so that the .htaccess file is actually used by adding the following for your virtual host configuration:

DocumentRoot /var/www/html

<Directory /var/www/html>
AllowOverride All
# Other stuff
</Directory>

The AllowOverride All directive makes it possible to override configuration directives from an .htaccess file on a per directory basis.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top