Как я могу создать ошибку 404 в PHP?

111

Мой .htaccess перенаправляет все запросы /word_hereна /page.php?name=word_here. Затем сценарий PHP проверяет, находится ли запрашиваемая страница в своем массиве страниц.

Если нет, то как смоделировать ошибку 404? Я попробовал это, но это не привело к моей 404 страницы настраивался через ErrorDocumentв .htaccessпоказ.

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

Правильно ли я считаю, что перенаправлять на страницу с ошибкой 404 неправильно?

Эрик
источник
Почему это не работает? Заголовок ответа сервера проверяли?
Гамбо
1
Отвечая на ваш заключительный вопрос, да, было бы плохой идеей перенаправлять все 404-е на настоящую страницу. Это нарушает спецификацию HTTP, превращая то, чего не должно быть, в то, что есть.
Лукас Оман,

Ответы:

157

Актуальный ответ (начиная с PHP 5.4 или новее) для создания страниц 404 должен использовать http_response_code:

<?php
http_response_code(404);
include('my_404.php'); // provide your own HTML for the error page
die();

die() не является строго необходимым, но гарантирует, что вы не продолжите нормальное выполнение.

лезвие
источник
в какой файл мне это добавить?
Julfikar
87

То, что вы делаете, будет работать, и браузер получит код 404. Чего он не сделает, так это отобразит страницу «не найдено», которую вы могли ожидать, например:

не обнаружена

Запрошенный URL /test.php не найден на этом сервере.

Это потому, что веб-сервер не отправляет эту страницу, когда PHP возвращает код 404 (по крайней мере, Apache этого не делает). PHP отвечает за отправку всего собственного вывода. Поэтому, если вам нужна похожая страница, вам придется отправить HTML самостоятельно, например:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

Вы можете настроить Apache для использования той же страницы для собственных сообщений 404, поместив это в httpd.conf:

ErrorDocument 404 /notFound.php
JW.
источник
Спасибо. Я предположил, что он использовал мою страницу 404.
Эрик
@JW, где будет использоваться приведенный выше код? это код для файла .htaccess.
Манохар Кумар
@ManoharKumar, указанный выше, используется в том месте, куда вы хотите отправить страницу 404. В моем случае я использовал, когда кто-то искал элемент с его кодом, но его не существовало. поэтому я использую приведенный выше код после того, как узнаю, что этот элемент недоступен, и я также использовал exit в 3-й строке этого кода, чтобы избежать загрузки чего-либо после страницы 404. Спасибо, JW, у меня это сработало идеально.
Harsha
22

Попробуй это:

<?php
header("HTTP/1.0 404 Not Found");
?>
Атес Горал
источник
3
Что ж, 404 - это 404 как в HTTP 1.0, так и в 1.1. 1.0 - беспроигрышный вариант. Классная шутка, кстати :) +1
Ates Goral
в моем случае я должен указать заголовок («Location: HTTP / 1.0 404 Not Found»);
Академия
9

Создавайте собственные страницы ошибок с помощью файла .htaccess

1. 404 - страница не найдена

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - внутренняя ошибка сервера

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Запрещено

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - неверный запрос

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Требуется авторизация

RewriteEngine On
ErrorDocument 401 /401.html

Вы также можете перенаправить все ошибки на одну страницу. лайк

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
Иршад Хан
источник
RewriteEngine не имеет к этому никакого отношения; эту строку можно безопасно опустить для достижения того же результата.
WoodrowShigeru
3

Вы не забыли умереть () после отправки заголовка? Заголовок 404 не останавливает обработку автоматически, поэтому может показаться, что он ничего не сделал, если происходит дальнейшая обработка.

ПЕРЕНАПРАВЛЕНИЕ на страницу 404 нехорошо, но вы можете ВКЛЮЧИТЬ содержимое с нее без проблем. Таким образом, у вас есть страница, которая правильно отправляет статус 404 с правильного URL-адреса, но также имеет ваш вопрос «что вы ищете?» страница для читателя-человека.

Эли
источник
0

попробуйте положить

ErrorDocument 404 /(root directory)/(error file) 

в .htaccessфайле.

Сделайте это для любой ошибки, но замените ошибку 404.

красный крафтерит
источник
0

В Drupal или Wordpress CMS (и, вероятно, в других), если вы пытаетесь сделать так, чтобы некоторый пользовательский код php не существовал (если не выполняются некоторые условия), следующее работает хорошо, заставляя обработчик 404 CMS взять на себя:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>
Майк Годин
источник
-2

Сразу после этой строки попробуйте закрыть ответ, используя exitилиdie()

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
exit;

или

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
пользователь5891645
источник
1
Если вы это сделаете, пользователь увидит пустую страницу. Мой вопрос заключался в том, как отправить ту же страницу 404, которую я указал ErrorDocument, но с PHP.
Эрик
если вы хотите использовать ErrorDocument Убедитесь, что путь к вашему пользовательскому файлу ошибок соответствует корню примера сервера: скажем, ваш виртуальный путь / folder1 / folder2 / myhtaccess из корня сервера, ваш документ с ошибками будет выглядеть примерно так ErrorDocument 404 /folder1/folder2/my404.html
user5891645 04
ErrorDocumentне имеет никакого эффекта после того, как вы уже ввели код PHP. этот ответ лучше всего объясняет путаницу, с которой я столкнулся 9 лет назад
Эрик
Надеюсь, ваша проблема уже решена. По не теме, думаю, лучше не перенаправлять с помощью? Name = word_here. Вместо этого используйте $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");в своем файле page.php. Coz есть сценарий, когда одна из этих страниц ожидает запроса «имя» от пользователя.
user5891645
-2

попробуйте это один раз.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Мани Кандан
источник