Как отобразить страницу Apache 404 по умолчанию в PHP - PullRequest
15 голосов
/ 10 мая 2011

У меня есть веб-приложение, которое должно обработать URI, чтобы определить, существует ли страница в базе данных. У меня нет проблем с направлением URI в приложение с помощью .htaccess:

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

Моя проблема в том, что если страница не существует, я не хочу использовать пользовательский обработчик 404, написанный на PHP, я хотел бы показать страницу Apache 404 по умолчанию. Есть ли способ заставить PHP передать выполнение обратно в Apache, когда он определил, что страница не существует?

Ответы [ 3 ]

14 голосов
/ 10 мая 2011

Я не думаю, что вы можете «вернуть его» 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;
}
6 голосов
/ 10 мая 2011

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

PS: URI, такой как /foo, если он не найден в базе данных, в браузере станет /foo?notFound=1.

4 голосов
/ 10 мая 2011

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

http_send_status(404);
...