我有一个webapp需要处理URI以查找数据库中是否存在页面。我可以使用.htaccess:
将URI指向应用程序Options +FollowSymlinks
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?p=$1 [NC]
我的问题是,如果页面不存在,我不想使用用PHP编写的自定义404处理程序,我想显示默认的Apache 404页面。有没有办法让PHP在确定页面不存在时将执行权交还给Apache?
答案 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);