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

Mat*_*att 15 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]
Run Code Online (Sandbox Code Playgroud)

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

and*_*ber 14

我不认为你可以"回复"给Apache,但你可以发送适当的HTTP头,然后明确地包含你的404文件,如下所示:

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

更新

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

if (! $exists) {
    http_response_code(404);
    include_once("404.php");
    exit;
}
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 6

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

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

然后稍微修改你的.htaccess:

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

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

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