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

Pek*_*ica 32 apache mod-rewrite

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

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----
Run Code Online (Sandbox Code Playgroud)

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

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

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf
Run Code Online (Sandbox Code Playgroud)

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

mer*_*tor 47

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

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

所以这:

RewriteRule ^/?page\.html$ - [R=404]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是否存在前导"/"取决于重写规则是在全局配置中(在何处存在)还是.htaccess(在[filename-to-URL映射]中剥离它(http:// httpd) .apache.org /文档/电流/重写/ rewrite_tech.html)).使用`/?`作为可在任一上下文中工作的子模式. (9认同)

Gum*_*mbo 11

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

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]
Run Code Online (Sandbox Code Playgroud)

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

  • 或者为了清楚起见,将其拼写为[redirect = 404]. (2认同)

Max*_*Max 5

我证实了这一点

RewriteRule ^ - [L,R=404]
Run Code Online (Sandbox Code Playgroud)

要么

RewriteRule ^ - [L,redirect=404]
Run Code Online (Sandbox Code Playgroud)

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

但是,如果状态代码在重定向范围(300-399)之外,则替换字符串将完全丢弃,并且重写将停止,就像使用了L一样.

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