【问题标题】:Redirect to Apache built-in 404 page with mod_rewrite?使用 mod_rewrite 重定向到 Apache 内置 404 页面?
【发布时间】:2011-01-27 16:10:48
【问题描述】:

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

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

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

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

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

但是这样会在错误页面上给用户提示"/sflkadsölfkasdfölkasdflökasdf不存在",看起来有点不专业。

【问题讨论】:

标签: apache mod-rewrite


【解决方案1】:

我确认

RewriteRule ^ - [L,R=404]

或

RewriteRule ^ - [L,redirect=404]

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

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

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

【讨论】:

    【解决方案2】:

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

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

    所以这个:

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

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

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

    【讨论】:

    • 嗯不确定这是否会触发默认错误页面,是吗?因为我必须给whatever 赋予一些价值,它会在那里重定向,不是吗?我可能错了,我会尝试并报告。
    • 不,正如引用所说,它忽略了替换字符串(即我的示例中的“whatever”)。
    • @mercator 就像一个魅力,只需要删除RewriteRule ^/page.html 中的/。
    • @Pekka,太好了!并固定。我有点忽略了[R=404] 以外的所有内容。其余的都照常工作。
    • 前导“/”的存在与否取决于重写规则是在全局配置中(它存在的地方)还是.htaccess(它被filename-to-URL mapping 剥离的地方)。将/? 用于可在任一上下文中工作的子模式。
    【解决方案3】:

    最好的方法是设置 R 标志,状态码为 404:

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

    但这仅在 Apache 2 之后可用。

    【讨论】:

    • 或为清楚起见,将其拼写为 [redirect=404]。
    • 通常,NC 是另一种很好的成分。请记住,如果 RewriteEngine 可能关闭,则 normales filesmatch-Forbid from All 可能更安全。
    【解决方案4】:

    这应该可行:

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

    【讨论】:

    • 是的,这可能就是我要结束的。我很好奇是否有一种方法可以触发 Apache 的内置错误页面(无需自己创建一个。)类似于重写规则“如果此 URL 匹配,则触发内部 404 处理。”
    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多