用mod_rewriteredirect到Apache内build的404页面?

有没有一种方法可以使用mod_rewrite主动为Apache的默认内置404页面提供多个URL? 不是一个自定义的错误文档,但像一个规则

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

我知道如何构build一个发送404头的PHP页面,并将mod_rewriteredirect到那里的所有URL,但我更喜欢只基于mod_rewrite的解决scheme。

我只是想redirect到一个不存在的地址:

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

但是会在错误页面上给用户留言“/sflkadsölfkasdfölkasdflökasdfdoes not exist” ,这看起来有点不专业。

您可以使用RewriteRule上的R标志来强制重定向给定的状态码:

虽然这通常用于重定向,但可以在此处给出任何有效的状态码。 如果状态码超出了重定向范围(300-399),那么替换字符串将被删除,并且停止重写,就像使用了L标志一样。

所以这:

 RewriteRule ^/?page\.html$ - [R=404] 

会返回/page.html的默认404页面。 由于这是一个正则表达式,请记住转义\. 并锚定$

-被忽略(即“替换字符串被丢弃”),但是仍然需要有一些东西来保持规则的正确性。

最好的办法是用状态码404设置R标志:

 RewriteCond %{REQUEST_URI} ^/dirname/pagename RewriteRule ^ - [L,R=404] 

但是这仅在Apache 2之后才可用。

我确认

 RewriteRule ^ - [L,R=404] 

要么

 RewriteRule ^ - [L,redirect=404] 

将无法工作。 以下是来自Apache官方网站的解释:

但是,如果状态码超出重定向范围(300-399),则替换字符串将被完全删除,并且重写将停止,就像使用了L一样。

所以最好的解决方案是使用404头重定向到404.php文件,稍后会介绍。

这应该工作:

 RewriteEngine on RewriteRule ^/page.html /error404.html [L] 

这不会给404头。 你可以尝试chaning标志为[L,R=404]但我怀疑这将工作(它应该是只为重定向)。

你在PHP中这样做的想法将工作。 如果你所有的“错误页面”页面是服务器端(即PHP),那么你可以简单地使用这个代码:

 <?php header( 'HTTP/1.0 404 Not Found' ); include 'error404.html';