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

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

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

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

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

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

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

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

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

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

 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(); } 

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

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

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

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

 <?php header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); header("Status: 404 Not Found"); $_SERVER['REDIRECT_STATUS'] = 404; ?> <!-- 404 contents below this line --> 

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

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

Начиная с php 5.4 теперь вы можете выполнить http_response_code(404);

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

попробуйте:

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

До свидания!

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

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

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

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

Старый веб-сайт, который имеет большую коллекцию многоязычных технических документов, выполнял это внутри 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"); 

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

 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(); } 

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

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

я надеюсь, что это поможет вам.

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

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

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