Почему мое приложение PHP не отправляет ошибку 404? - PullRequest
141 голосов
/ 13 января 2009
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
}

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

Ответы [ 16 ]

306 голосов
/ 13 января 2009

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

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

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

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

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

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

78 голосов
/ 13 января 2009
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();
}

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

74 голосов
/ 13 января 2009

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

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

16 голосов
/ 07 октября 2012

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

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
14 голосов
/ 08 июня 2011

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

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}
13 голосов
/ 18 декабря 2013

С php 5.4 теперь вы можете делать http_response_code(404);

4 голосов
/ 15 октября 2013

попробуйте с:

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

Bye!

4 голосов
/ 02 июля 2013

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

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, и несуществующую страницу.

2 голосов
/ 19 июня 2011
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;
}

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

2 голосов
/ 10 октября 2010

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

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.");
}
...