PHP заголовок 404 не работает

#php #.htaccess #http-status-code-404

#php #.htaccess #http-status-code-404

Вопрос:

Почему это не работает, так как в предустановленном 404 страница не загружается:

 header("HTTP/1.0 404 Not Found");
exit;
  

.htaccess установлена ErrorDocument 404 /404.html директива.

Спасибо.

Ответ №1:

К сожалению, я недавно столкнулся с такой же проблемой во время работы над проектом PHP for work.

Отправка заголовка, по сути, является всего лишь «сообщением о состоянии» и не заставляет браузер или сервер отображать определенную страницу (хотя я полагаю, что некоторые более старые версии IE могут отображать страницу 404 по умолчанию). Это означает, что вам нужно будет создать собственное сообщение об ошибке 404 в вашем скрипте, поскольку обработка ошибок .htaccess не будет работать.

Я предлагаю использовать что-то вроде

 header("HTTP/1.0 404 Not Found");
include('./404.html');
exit;
  

Я знаю, это может показаться глупым, но пока это единственный способ, который я нашел, который будет работать.

Комментарии:

1. Привет, Санни, если все остальное не сработает, я попробую, но это действительно кажется глупым. Я уже сообщил браузеру, что страница не существует, и это также первая строка вывода.

Ответ №2:

Убедитесь, что размер содержимого вашей настроенной страницы с ошибкой /404.html превышает 512 байт. Многие браузеры, такие как IE, Chrome и т.д., Не отображают вашу пользовательскую страницу, если длина содержимого вашей пользовательской страницы 404 меньше 512.

Обновить

Основываясь на ваших комментариях, вот что, я думаю, происходит.

Если вы посмотрите на access.регистрируйте заголовки http в Firebug / HTTP Watch и т.д. На этой пустой странице вы увидите код возврата 404. Как только веб-сервер начинает обрабатывать страницу PHP, он уже прошел точку, когда он будет обрабатывать обработку 404 самостоятельно, поскольку ваш php-файл фактически НАЙДЕН. Теперь, поскольку ваш php-код просто возвращает статус 404 без какого-либо содержимого, поэтому отображается пустая страница.

Теперь, поскольку это правильное поведение apache, вам предстоит создать содержимое для страницы 404. Что-то вроде этого в вашем приведенном выше php-коде будет в порядке, я думаю:

 <?php
header("HTTP/1.0 404 Not Found");
exit("<h1>Not Found</h1>
The requested URL " . $_SERVER["REQUEST_URI"] . " was not found on this server.
<hr>");
?>
  

Комментарии:

1. Хм, ну, для начала я хотел бы получить ошибку 404 по умолчанию, а не пользовательскую.

2. Если у вас есть ErrorDocument 404 /404.html директива в .htaccess, то не означает ли это, что вы пытаетесь отобразить 404.html ошибки 404.

3. Хаха, извините. Я забыл сказать вам, что сейчас это закомментировано.

4. Это именно то, что я искал, сводило меня с ума, поскольку я ожидал, что httpd разберется, какой 404 показывать. Я даже не думал о том, что php выводит код и страницу html. СПАСИБО!

Ответ №3:

Это, скорее всего, потому, что Apache уже передал первоначальный запрос на страницу PHP для обработки. Скорее всего, потому, что у вас действует реализация front controller и вы перенаправляете все веб-запросы на эту страницу. Это возлагает ответственность за 404s на ваше приложение вместе с отображением соответствующей страницы 404.

Комментарии:

1. Это правда, весь трафик перенаправляется на эту страницу — это SEO-штука с удобными URL-адресами.

Ответ №4:

Я заметил, что это не работает, поэтому я создал класс со статическим методом для решения проблемы

У меня есть каталог, /error-pages где я храню все файлы ошибок

У меня есть файл класса error.php , который может быть включен в начало каждой страницы

 class ServerError{
    public static function show($page){
        require $_SERVER['DOCUMENT_ROOT'].'/error-pages/'.$page.'.php';
        exit();
    }
}
  

Итак, на вашей home.php странице, например, вы говорите

 if (my404IsTrue) {
    ServerError::show("404");
}
  

таким образом. вы можете использовать его для любого другого вида ошибки, будь то ошибка 403 или пользовательская ошибка

Надеюсь, это поможет