Redirect to Apache built-in 404 page with mod_rewrite?

后端 未结 4 1150
庸人自扰
庸人自扰 2020-11-30 10:49

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

相关标签:
4条回答
  • 2020-11-30 11:19

    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';
    
    0 讨论(0)
  • 2020-11-30 11:33

    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.

    0 讨论(0)
  • 2020-11-30 11:38

    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.

    0 讨论(0)
  • 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.

    0 讨论(0)
提交回复
热议问题