views:

223

answers:

3

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

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----

I know how to build a PHP page that sends the 404 header and have mod_rewrite redirect all the URLs there but I would prefer a solution that is based on mod_rewrite only.

I just had the idea of redirecting to a non-existent address:

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf

but that would give the user the message "/sflkadsölfkasdfölkasdflökasdf does not exist" on the error page, which looks a bit unprofessional.

+1  A: 

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';
DisgruntledGoat
Yup, this is probably what I'm going to end up with. I'm curious though whether there is a way to trigger Apache's built-in error page (without having to create one myself.) Something like a rewrite rule "trigger internal 404 handling if this URL matches."
Pekka
+2  A: 

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 whatever [R=404]

would return the default 404 page for /page.html.

whatever is ignored (i.e. "the Substitution string is dropped"), but there still needs to be something there to keep the rule well-formed. You'd probably want to put something there that indicates what's going on and can't be mistaken for an existing page; probably not "whatever", in any case.

mercator
Mmm not sure whether that would trigger the default error page, would it? Because I would have to put some value to `whatever` and it would redirect there wouldn't it? I may be wrong though, I'll try it out and report.
Pekka
No, as the quote says, it ignores the Substitution string (i.e. the "whatever" in my example).
mercator
@mercator Of course. Sorry, I didn't read that.
Pekka
@Pekka, no problem :)
mercator
@mercator works like a charm, only the `/` in `RewriteRule ^/page.html` needs to be removed.
Pekka
@Pekka, excellent! And fixed. I kinda neglected everything other than the `[R=404]`. The rest works the same as usual anyway.
mercator
+2  A: 

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.

Gumbo