Is there a way to actively serve Apache\'s default, built-in 404 page for a number of URLs using mod_rewrite? Not a custom error document, but a rule like
This should work:
RewriteEngine on
RewriteRule ^/page.html /error404.html [L]
That won't give the 404 header though. You could try chaning to flag to [L,R=404]
but I doubt that will work (it's supposed to be for redirects only).
Your idea of doing so in PHP would work. If all your "error pages" pages are server-side (i.e. PHP) then you could simply use this code:
<?php
header( 'HTTP/1.0 404 Not Found' );
include 'error404.html';
I confirm that
RewriteRule ^ - [L,R=404]
or
RewriteRule ^ - [L,redirect=404]
won't work. Here is the explanation from the official Apache website:
However, if a status code is outside the redirect range (300-399) then the substitution string is dropped entirely, and rewriting is stopped as if the L were used.
So the best solution is to redirect to a 404.php file with the 404 header as explained later.
The best way to do that is to set the R flag with the status code 404:
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]
But this is only available since Apache 2.
You can use the R
flag on the RewriteRule to force a redirect with a given status code:
While this is typically used for redirects, any valid status code can be given here. If the status code is outside the redirect range (300-399), then the Substitution string is dropped and rewriting is stopped as if the L flag was used.
So this:
RewriteRule ^/?page\.html$ - [R=404]
would return the default 404 page for /page.html
. Since this is a regexp, remember the escaping \.
and anchoring $
.
-
is ignored (i.e. "the Substitution string is dropped"), but there still needs to be something there to keep the rule well-formed.