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

发布于 2024-11-06 09:23:35 字数 326 浏览 0 评论 0原文

我有一个 Web 应用程序需要处理 URI 以查找数据库中是否存在页面。我可以使用 .htaccess 将 URI 定向到应用程序:

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

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

I have a webapp that needs to process the URI to find if a page exists in a database. I have no problem directing the URI to the app with .htaccess:

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

My problem is that if the page does not exist, I do not want to use a custom 404 handler written in PHP, I would like do show the default Apache 404 page. Is there any way to get PHP to hand execution back to Apache when it has determined that the page does not exist?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

百变从容 2024-11-13 09:23:35

我不认为您可以将其“交回”给 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;
}

I don't think you can "hand it back" to Apache, but you can send the appropriate HTTP header and then explicitly include your 404 file like this:

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

Update

PHP 5.4 introduced the http_response_code function which makes this a little easier to remember.

if (! $exists) {
    http_response_code(404);
    include_once("404.php");
    exit;
}
绝情姑娘 2024-11-13 09:23:35

对于上述情况,我知道的唯一可能的方法是在您的 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

The only possible way I am aware of for the above scenario is to have this type of php code in your index.php:

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

And then slightly modify your .htaccess like this:

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

That way Apache will show default 404 page for this special case because of extra query parameter ?notFound=1 added from php code and with the negative check for the same in .htaccess page it will not be forwarded to index.php next time.

PS: A URI like /foo, if not found in database will become /foo?notFound=1 in the browser.

二智少女猫性小仙女 2024-11-13 09:23:35

调用这个函数:

http_send_status(404);

Call this function:

http_send_status(404);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文