#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 или пользовательская ошибка
Надеюсь, это поможет