重定向到带有mod_rewrite的Apache内置404页面?

重定向到带有mod_rewrite的Apache内置404页面?,apache,mod-rewrite,Apache,Mod Rewrite,有没有一种方法可以使用mod_rewrite为大量URL主动提供Apache的默认内置404页面?不是自定义错误文档,而是类似于 RewriteCond %{REQUEST_URI} ^/dirname/pagename RewriteRule -- serve 404 page ----- 我知道如何构建一个PHP页面,发送404头并让mod_rewrite重定向那里的所有URL,但我更喜欢只基于mod_rewrite的解决方案 我刚想到要重定向到一个不存在的地址: RewriteCond

有没有一种方法可以使用mod_rewrite为大量URL主动提供Apache的默认内置404页面?不是自定义错误文档,而是类似于

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----
我知道如何构建一个PHP页面,发送404头并让
mod_rewrite
重定向那里的所有URL,但我更喜欢只基于
mod_rewrite
的解决方案

我刚想到要重定向到一个不存在的地址:

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf
但这会在错误页面上给用户一条信息,“/sflkadsölfkasdfölkasdflökasdf不存在”,这看起来有点不专业。

这应该可以:

RewriteEngine on
RewriteRule ^/page.html /error404.html [L]
但这不会给出404头。您可以尝试更改标记为
[L,R=404]
,但我怀疑这是否有效(它应该只用于重定向)

您使用PHP这样做的想法会奏效。如果您所有的“错误页面”页面都是服务器端(即PHP),那么您可以简单地使用以下代码:

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

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

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

因此:

RewriteRule ^/?page\.html$ - [R=404]
将返回
/page.html
的默认404页。由于这是一个regexp,请记住转义
\.
和锚定
$


-
被忽略(即“替换字符串被删除”),但仍然需要一些东西来保持规则的良好格式。

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

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]
但这只在Apache2之后才可用。

我确认这一点

RewriteRule ^ - [L,R=404]

不行。以下是Apache官方网站的解释:

但是,如果状态代码超出重定向范围(300-399),则 替换字符串被完全删除,重写被停止 就好像我被用过一样


因此,最好的解决方案是重定向到一个404.php文件,该文件带有404头,如下文所述。

Voter to close:mod_rewrite问题正式可以解决。是的,这可能就是我的结局。我很好奇是否有一种方法可以触发Apache的内置错误页面(无需自己创建)。类似于重写规则“如果此URL匹配,则触发内部404处理”。嗯,我不确定这是否会触发默认错误页面,是吗?因为我必须给
任何东西添加一些值,它会重定向到那里,不是吗?虽然我可能错了,但我会尝试一下并报告。不,正如引用所说,它忽略了替换字符串(即我的示例中的“whatever”)@mercator的工作方式很有魅力,只需删除
RewriteRule^/page.html
中的
/
。@Pekka,太棒了!而且是固定的。除了
[R=404]
之外,我几乎忽略了一切。其余部分的工作原理与往常一样。前导“/”的存在与否取决于重写规则是在全局配置中(存在的地方)还是在.htaccess中(被删除的地方)。使用
/?
作为一个子模式,该子模式将在任一上下文中工作。或者为了清晰起见,将其拼写为[redirect=404]。通常,NC是另一个好的成分。请记住,若重写引擎可能关闭,则Normals filesmatch Fork from All可能更安全。
RewriteRule ^ - [L,redirect=404]