Как отобразить страницу 404 Apache по умолчанию в 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, когда он определил, что страница не существует?

Единственный возможный способ, который я знаю для вышеприведенного сценария, – иметь этот тип 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 в браузере.

Я не думаю, что вы можете «передать его обратно» в 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; } 

Вызовите эту функцию:

 http_send_status(404);