After spending a whole 2 hours of my life trying to get Apache mod-rewrite rules working with XAMPP on a local computer, I thought I’d share my results as I seemingly tried everything. The problem, I have a simple mod-rewrite rule in my htaccess file. When I upload this to my online web host everything is fine – the working htaccess file for my online host:
RewriteBase / RewriteEngine on RewriteRule amnesia/resetpass(.*) recover-password.php$1 [PT]
So typing in www.domain.com/amnesia/resetpass
does a simple re-write to www.domain.com/recover-password.php
, without the user ever knowing. All is fine. However, when I treid to get this seemingly simple rule to work with XAMPP I ran into problems, getting 404 and 500 responses from the server – obviously quite a pain as this essentially means I can’t test the site using my own web server (E.g. localhost). The site hosted from my computer via the normal setup E.g. xampp/htdocs/mysite. I’ll jump straight to the solution and then explain exactly what things were changed – the working htaccess file is below:
RewriteEngine on RewriteBase /mysite options +FollowSymLinks RewriteRule amnesia/resetpass(.*) recover-password.php$1 [PT]
Firstly, the extra line that uses the +FollowSymLinks
directive was added. To explain this I’ll quote straught from the Apache documentation:
To enable the rewriting engine for per-directory configuration files, you need to set “
RewriteEngine On
” in these files and “Options FollowSymLinks
” must be enabled. If your administrator has disabled override ofFollowSymLinks
for a user’s directory, then you cannot use the rewriting engine. This restriction is needed for security reasons.
The re-write base has been changed to the relative path of the website directory. To finish up, open the http.conf file (the default settings for XAMPP, that get overwritten with you .htaccess file rules on a directory basis), located by default at C:\xampp\apache\conf\http.conf. Find all occurances of AllowOverride None
and change it to AllowOverride All
. After restarting XAMPP everythign should work. In a nutshell changing the AllowOverride directive in the http.conf file decalres which directives in .htaccess files can override directives from httpd.conf, this is discussed in more dept over here, but basically by having this directive set to None, you’re stopping individual htaccess files from working locally.