12 I found the answer in a great explanation of mod_rewrite and mod_alias The problem is that mod_rewrite always occurs before mod_alias, regardless of the order the are placed in .htaccess. This is the reverse of the order required for this situation. The trick is to use RewriteRule [R=301] instead of redirect 301, and hence use mod_rewrite for everything instead of mixing it with mod_alias. Full solution is as follows: RewriteEngine on RewriteBase / RewriteRule ^oldpage1.html /newpage1.php [R=301,L] RewriteRule ^oldpage2.php /newpage2.php [R=301,L] RewriteRule ^oldpage3.php /newpage3.php [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ index.php?page=$1