Как отобразить страницу Apache по умолчанию 404 в PHP
У меня есть webapp, которому необходимо обработать URI, чтобы найти, существует ли страница в базе данных. У меня нет проблем с направлением URI в приложение с помощью .htaccess:
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?p=$1 [NC]
Моя проблема в том, что если страница не существует, я не хочу использовать пользовательский обработчик 404, написанный на PHP, я бы хотел показать страницу Apache 404 по умолчанию. Есть ли способ заставить PHP выполнить выполнение обратно в Apache, когда он определил, что страница не существует?
Ответы
Ответ 1
Единственным возможным способом, который я знаю для вышеупомянутого сценария, является наличие этого типа php-кода в вашем index.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 для этого особого случая из-за дополнительного параметра запроса ?notFound=1
, добавленного из php-кода, и с отрицательной проверкой для него на странице .htaccess он не будет перенаправлен на index.php в следующий раз.
PS: URI, например /foo
, если он не найден в базе данных, станет /foo?notFound=1
в браузере.
Ответ 2
Я не думаю, что вы можете "передать его обратно" в 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;
}
Ответ 3
Вызов этой функции:
http_send_status(404);