使用mod_rewrite重定向到Apache内置404页面?

时间:2010-03-15 12:42:22

标签: apache mod-rewrite

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

这样的规则
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----

我知道如何构建一个发送404标头的PHP页面,并mod_rewrite重定向所有网址,但我更喜欢仅基于mod_rewrite的解决方案。

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

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

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

4 个答案:

答案 0 :(得分:45)

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

  

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

所以这个:

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

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

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

答案 1 :(得分:11)

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

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

但这只能在Apache 2之后使用。

答案 2 :(得分:5)

我确认

RewriteRule ^ - [L,R=404]

RewriteRule ^ - [L,redirect=404]

不起作用。以下是官方Apache网站的解释:

  

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

所以最好的解决方案是使用404标头重定向到404.php文件,如后面所述。

答案 3 :(得分:2)

这应该有效:

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';