如何在PHP中显示Apache的默认404页面

时间:2011-05-10 16:14:17

标签: php apache .htaccess http-status-code-404

我有一个webapp需要处理URI以查找数据库中是否存在页面。我可以使用.htaccess:

将URI指向应用程序
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?p=$1 [NC]

我的问题是,如果页面不存在,我不想使用用PHP编写的自定义404处理程序,我想显示默认的Apache 404页面。有没有办法让PHP在确定页面不存在时将执行权交还给Apache?

3 个答案:

答案 0 :(得分:14)

我认为你不能把它“交回”给Apache,但是你可以发送适当的HTTP头,然后明确地包含你的404文件:

if (! $exists) {
    header("HTTP/1.0 404 Not Found");
    include_once("404.php");
    exit;
}

<强>更新

PHP 5.4引入了http_response_code函数,这使得它更容易记住。

if (! $exists) {
    http_response_code(404);
    include_once("404.php");
    exit;
}

答案 1 :(得分:6)

我知道上述场景的唯一可能方法是在index.php中使用这种类型的PHP代码:

<?php
if (pageNotInDatabase) {
   header('Location: ' . $_SERVER["REQUEST_URI"] . '?notFound=1');
   exit;
}

然后稍微修改你的.htaccess:

Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{QUERY_STRING} !notFound=1 [NC]
RewriteRule ^(.*)$ index.php?p=$1 [NC,L,QSA]

这样,Apache将显示此特殊情况的默认404页面,因为从PHP代码添加了额外的查询参数?notFound=1,并且在.htaccess页面中对其进行了否定检查,它将不会转发到index.php下次。

PS: /foo之类的URI,如果在数据库中找不到,将在浏览器中变为/foo?notFound=1

答案 2 :(得分:4)

调用此函数:

http_send_status(404);