Почему мое приложение PHP не отправит ошибку 404?

if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
}

Почему это не работает? Я получаю пустую страницу.

Ответ 1

Ваш код технически корректен. Если вы посмотрите на заголовки этой пустой страницы, вы увидите заголовок 404, и другие компьютеры/программы смогут правильно идентифицировать ответ, поскольку файл не найден.

Конечно, ваши пользователи все еще SOL. Обычно 404s обрабатываются веб-сервером.

  • Пользователь: Привет, у вас есть что-нибудь для меня на этом веб-сервере URI?
  • Веб-сервер: Нет, не знаю, 404! Здесь страница, отображаемая для 404s.

Проблема заключается в том, что, как только веб-сервер начинает обрабатывать страницу PHP, он уже прошел точку, где он будет обрабатывать 404

  • Пользователь: Привет, у вас есть что-нибудь для меня на этом веб-сервере URI?
  • Веб-сервер: Да, это страница PHP. Он скажет вам, что код ответа
  • PHP: Эй, OMG 404!!!!!!!
  • Webserver: Ну, дерьмо, люди из 404 страниц уже ушли домой, поэтому я просто отправлю все, что мне дал PHP.

В дополнение к предоставлению заголовка 404, PHP теперь отвечает за вывод фактической страницы 404.

Ответ 2

if (strstr($_SERVER['REQUEST_URI'],'index.php')){
    header('HTTP/1.0 404 Not Found');
    echo "<h1>404 Not Found</h1>";
    echo "The page that you have requested could not be found.";
    exit();
}

Если вы посмотрите на две последние эхо-строки, где вы увидите контент. Вы можете настроить его, как хотите.

Ответ 3

Это правильное поведение, это зависит от вас, чтобы создать содержимое страницы 404.
Заголовок 404 используется пауками и менеджерами загрузки, чтобы определить, существует ли файл.
(Страница с заголовком 404 не будет проиндексирована Google или другими поисковыми системами)

Обычные пользователи, однако, не смотрят на http-заголовки и не используют страницу как обычную страницу.

Ответ 4

Для записи это обработчик для всех случаев:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->

Ответ 5

Загрузите страницу 404 сервера по умолчанию, если она есть, например. для apache:

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}

Ответ 7

Другое решение, основанное на @Kitet.

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

$_SERVER['REDIRECT_STATUS'] = 404;
//If you don't know which web page is in use, use any page that doesn't exists
$handle = curl_init('http://'. $_SERVER["HTTP_HOST"] .'/404missing.html');
curl_exec($handle);

Если вы программируете веб-сайт, размещенный на сервере, у вас нет контроля, вы не будете знать, какой файл является "404missing.html". Однако вы все еще можете это сделать.

Таким образом, вы предоставили точно такой же результат нормальной 404 страницы на том же сервере. Наблюдатель не сможет отличить существующую PHP-страницу от возвратов 404 и несуществующую страницу.

Ответ 8

попробуйте:

header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');

Bye!

Ответ 9

Немного короче. Подавить нечетное эхо.

if (strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  exit("<h1>404 Not Found</h1>\nThe page that you have requested could not be found.");
}

Ответ 10

if($_SERVER['PHP_SELF'] == '/index.php'){ 
   header('HTTP/1.0 404 Not Found');
   echo "<h1>404 Not Found</h1>";
   echo "The page that you have requested could not be found.";
   die;
}

никогда не упрощайте инструкции эха и никогда не забывайте о том, что такое двоеточие, например выше, также зачем запускать субстрат на странице, мы можем просто запустить php_self

Ответ 11

Если вы хотите, чтобы страница ошибок по умолчанию сервера отображалась, вам необходимо обработать ее на сервере.

Ответ 12

Вы делаете это правильно, хотя он может использовать некоторые уточнения. Похоже, что это было рассмотрено, поэтому давайте поговорим о практических преимуществах приложения:

Старый веб-сайт, у которого есть большая коллекция многоязычных технических документов, выполнял это внутри if if условно:

    if (<no file found>){
        die("NO FILE HERE");
    }

Проблема (помимо бесполезного сообщения и плохой пользовательский опыт) заключается в том, что мы обычно используем искатель ссылок (в нашем случае целостность), чтобы проверить плохие ссылки и недостающие документы. Это означает, что мы получили совершенно корректный ответ на ошибку 200, сообщающий нам, что там был файл. Целостность не знала, что мы ожидаем PDF, поэтому нам пришлось вручную добавить заголовок 404 с php. Добавив свой код над штампом (потому что после него ничего не будет выполнено, и заголовок всегда должен быть до любого отображаемого html), целостность (которая ведет себя более или менее как браузер) вернет 404, и мы точно знаем, где искать отсутствующие файлы. Есть более элегантные способы сообщить пользователю, что есть ошибка, но, слушая ошибку 404, вы не только уведомляете браузеры и браузерные программы об ошибке, но (я считаю, что верьте мне, если я ошибаюсь) также записывая эти ошибки в ваших журналах сервера, где вы можете легко grep для 404s.

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");

Ответ 13

Попробуйте следующее:

if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
    echo "<head><title>404 Not Found</title></head>";
    echo "<h1>Not Found</h1>";
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    echo "<p>The requested URL ".$uri." was not found on this server.</p>";
    exit();
}

Ответ 14

Знаете, на моем сайте я создал что-то вроде этого:

        $uri=$_SERVER['REQUEST_URI'];
        $strpos=strpos($uri, '.php');
        if ($strpos!==false){
        $e404="The page requested by you: &quot".$_SERVER['REQUEST_URI']."&quot, doesn't exists on this server.";
        $maybe=str_replace('.php','',$uri);
        $maybe=str_replace('/','',$maybe);
        die("<center><h1>404</h1><hr><h3>$e404</h3><h3>Maybe try <a href=$maybe>www.leaveyortexthere.p.ht/$maybe</a>?</center>");

}

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

Ответ 15

Я подошел к этой проблеме. Я думаю, что перенаправление на несуществующую ссылку на вашем сервере может сделать трюк! Потому что сервер вернет свой 404:
header('Redirect abbb.404.nonexist'); < это точно не существует

Ответ 16

Если вы хотите показать страницу 404 по умолчанию сервера, вы можете загрузить ее в таком кадре, как это:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';