重定向至Apache内置404页面,其中包含mod_rewrite?

Redirect to Apache built-in 404 page with mod_rewrite?

提问人:Pekka 提问时间:3/15/2010 最后编辑:David MolesPekka 更新时间:11/17/2015 访问量:69780

问:

有没有办法使用 mod_rewrite 为多个 URL 主动提供 Apache 默认的内置 404 页面?不是自定义错误文档,而是像这样的规则

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

我知道如何构建一个发送 404 标头的 PHP 页面并将所有 URL 重定向到那里,但我更喜欢仅基于mod_rewritemod_rewrite

我只是想到重定向到一个不存在的地址:

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

但这会在错误页面上给用户显示消息“/sflkadsölfkasdfölkasdflökasdf 不存在”,这看起来有点不专业。

apache mod-重写

评论

1赞 Pekka 3/15/2010
选民关闭:mod_rewrite问题在 SO 上正式没问题。meta.stackexchange.com/questions/39063/......

答:

3赞 DisgruntledGoat 3/15/2010 #1

这应该有效:

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

不过,这不会给出 404 标头。您可以尝试 chaning to 标记,但我怀疑这是否有效(它应该仅适用于重定向)。[L,R=404]

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

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

评论

0赞 Pekka 3/15/2010
是的,这可能就是我最终会得到的。我很好奇是否有办法触发 Apache 的内置错误页面(无需自己创建一个。类似于重写规则“如果此 URL 匹配,则触发内部 404 处理”。
0赞 Jacob 8/4/2023
这个解决方案是我或多或少使用的,除了我认为我只是重定向到一个不存在的页面 - 现在我建议在应用程序级别进行,因为它允许更大的灵活性和对用户访问静态文件和动态资源的控制。您可以只向路由器提供要 404 输出的目录和文件列表。根据您的 CMS(如果不受支持),您可能需要从装饰器执行此操作或自行修改路由代码。请记住,在 404 的这种情况下,性能通常可以忽略不计。index.php
60赞 mercator 3/15/2010 #2

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

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

所以这个:

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

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

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

评论

0赞 Pekka 3/15/2010
嗯,不确定这是否会触发默认错误页面,是吗?因为我必须给它一些价值,它会重定向到那里,不是吗?不过我可能错了,我会尝试一下并报告。whatever
0赞 mercator 3/15/2010
不,正如引号所说,它忽略了 Substitution 字符串(即我示例中的“whatever”)。
0赞 Pekka 3/19/2010
@mercator就像一个魅力,只需要去除 in。/RewriteRule ^/page.html
0赞 mercator 3/19/2010
@Pekka,太好了!并固定。我有点忽略了除了.无论如何,其余的工作方式与往常相同。[R=404]
9赞 outis 2/5/2011
前导“/”的存在与否取决于重写规则是在全局配置中(如果存在)还是在 .htaccess(由文件名到 URL 映射剥离)中。用于在任一上下文中都有效的子模式。/?
14赞 Gumbo 3/16/2010 #3

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

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

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

评论

2赞 Mark Stosberg 6/22/2012
或者为清楚起见,将其拼写为 [redirect=404]。
1赞 Frank N 2/2/2013
通常,NC是另一种很好的成分。请记住,如果 RewriteEngine 可能处于关闭状态,则 all、filesmatch-Forbid 可能更安全。
4赞 Max 1/7/2013 #4

我确认

RewriteRule ^ - [L,R=404]

RewriteRule ^ - [L,redirect=404]

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

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

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

评论

0赞 Bob 7/12/2022
Apache httpd 2.2 和 2.4 的文档都指定可以在您引用的句子中返回任何(强调他们的)有效状态代码,并且不必是 3xx 代码。你引用的那个只表示没有使用替换字符串,无论如何都会这样做。您提供的两个示例都应该有效。-