I have a virtual host running on my local copy of Apache. It has an alias.
<VirtualHost 127.0.0.1>
ServerName oliverash.me.dev
DocumentRoot "/usr/docs/oliverash.me/public"
Alias /mayor "/usr/docs/uni/tmosct/public"
</VirtualHost>
This works fine. I can access the alias by going to oliverash.me.dev/mayor
in my browser. However, I have a simple .htaccess rewrite
in that alias' folder, which rewrites everything (except folders) to the index.php page. This rewrite is working fine.
Although the rewrite is working, the rewrite returns with a 404 Not Found error. For instance, if I go to oliverash.me.dev/mayor/abcdefg
, that rewrites to the index.php
file, but I get this error:
"The requested URL /usr/docs/uni/tmosct/public/index.php was not found on this server."
This file does actually exist. I can access it directly.
When I use the same alias but for localhost
instead of just this virtual host, the rewrite works fine, and the index.php returns with the actual file, and not the 404. This makes me think it is something to do with the permissions of my virtual host. So I tried to add this beneath my httpd-vhosts.conf
(with no luck):
<Directory "/usr/docs/oliverash.me/public">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
These are the same settings that are used on the localhost
's DocumentRoot
, so I don't see why it's not helping.
UPDATE:
So I checked the Apache error_log. Turns out that the rewrites for this alias are actually relative to the document root of this virtual host.
[Fri Jan 06 22:30:57 2012] [error] [client 127.0.0.1] File does not exist: /usr/docs/oliverash.me.dev/usr
This rewrite is actually looking in /usr/docs/oliverash.me.dev/public/usr/docs/uni/tmosct/public
for index.php. Hopefully it is obvious that it should be looking in /usr/docs/oliverash.me.dev
.
UPDATE 2:
Okay, this is a problem I'm experiencing a local copy of Apache. However, I've just run into exactly the same problem for an alias on my live Web server. This isn't using any kind of virtual host.
[Sat Jan 07 02:41:51 2012] [error] [client 86.11.223.135] File does not exist: /var/www/html/var
Again, the path is relative to the DocumentRoot. It should be an absolute path.
Kinda annoying 🙁
UPDATE 3:
This is exactly the problem I am having, but perhaps much better phrased: http://forums.devshed.com/apache-development-15/rewritebase-alias-and-rewriterule-are-not-rooting-to-required-file-395917.html
Best Answer
Solution: The RewriteBase have to be the same as the Alias definition, not the physical path/directory in the filesystem!
Check the
RewriteBase
directive for mod_rewrite, it sounds like it could be related to that. Read about it at: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebaseEdit 1:
To try this out I setup a clean fresh Ubuntu in VMware, a clean apache2 installation and created a new folder out of the normal path, then setup a .htaccess and I made it work with a proper
RewriteBase
rule. The default DocumentRoot is /var/www, I put a index.php in there just to show me where I am. It echoes out "I am index.php in default!". Then I created this Alias in Apaches configuration:And in there I put another index.php saying "I am index.php in testberg!". Under /home/www/testberg I created a .htaccess with the following contents:
When I browse to http://192.168.100.183/testberg/apa.test I now see: "I am index.php in testberg!" and no errors in Apaches logfile, etc.
Isn't this what you wanted to accomplish?
Edit 2:
Trying with a different virtual host. On my Windows desktop I pointed ahntest.net to my VMware IP in
c:\windows\system32\drivers\etc\hosts
. On my VMware server I created/home/www/ahntest.net
and put a modified index.php there to echo "I am index.php in ahntest.net!" and created the following virtual host:Browsing to http://ahntest.net gives me "I am index.php in ahntest.net!", browsing to http://ahntest.net/testberg gives me "I am index.php in testberg!" and finally browsing to http://ahntest.net/testberg/apa.test gives me "I am index.php in testberg!" so it works just fine here too from what I can tell. The .htaccess/patch in Edit 2 is the same as under Edit 1 above.