2

典型场景:

  1. 数据库项目显示在页面中http://...?item_id=467
  2. 用户某天删除 了该项目
  3. Google 或用户尝试访问http://...?item_id=467
  4. PHP 挖掘 DB 并看到项目不再存在,所以现在 PHP 必须通过 404 标题和页面告诉 Google/用户该项目不存在。

根据这个答案,我理解没有办法通过 PHP 重定向到 404 Apache 页面,除非在代码中发送 404 标头 + 读取并将默认 404 页面的所有内容发送到客户端。

问题:我已经有一个Apache 解析的自定义404.shtml页面,所以我想简单地使用那个页面。但是,如果我通过 PHP 读取 shtml 页面,则 Apache 将不再对其进行解析

那你建议我怎么做?

是否有一些技巧我也可以用 htaccess 来使用?

谢谢,

4

4 回答 4

4

唔。想到两个想法:

  • 使用重定向到 404 页面header("Location:...")- 虽然这不是符合标准的行为。我只会用它作为最后一根稻草

  • 获取并输出 Apache 解析的 SHTML 文件使用file_get_contents("http://mydomain.com/404.shtml");- 也不最佳的,因为向 Web 服务器发出请求,但我认为在大多数情况下是可以接受的。

我怀疑您可以做任何事情,.htaccess因为 PHP 脚本在任何重写规则已经被解析后运行。

于 2010-11-20T11:07:14.923 回答
2

如果您使用的是 apache mod_php,请使用virtual('/404.shtml');向您的用户显示已解析的 shtml 页面。

于 2010-11-20T12:00:01.927 回答
0

我昨天试图做同样的事情。

Pekka 的 file_get_contents/include 是否会导致发送 404 状态标头?也许您需要在包含自定义错误页面之前执行此操作?

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

您可以使用这个 Firefox 扩展进行测试。

于 2010-11-20T11:55:23.543 回答
0

我正在寻找你需要的东西,所以你有一个页面:

http://example.com/page?item_id=456

如果以后您想要,如果缺少项目,您将被重定向到:

http://example.com/page_not_found?item_id=456

实际上,我发现将原始页面用作 404 页面是一种更易于维护的解决方案。

<?php
    $item = findItem( $_GET['item_id']);
    if($item === false){
        //show 404 page sending correct header and then include 404 message
        header( $_ENV['SERVER_PROTOCOL'].' 404 Not Found', true );
        // you can still use $_GET['item_id'] to customize error message
        // "maybe you were looking for XXX item"
        include('somepath/missingpage.php');
        return;
    }

    //continue as usual with normal page

?>

因此,如果项目不再在数据库中,则会显示 404 页面,但您可以在替换或错误消息中提供自定义项目。

于 2015-12-05T10:35:04.403 回答