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

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

Почему это не работает? У меня пустая страница.

Лучшим вариантом было бы отправить статус 404 и сразу добавить свою пользовательскую страницу 404. Это то, что я делал раньше.

Rocky 25.10.2012 11:05

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

Elmue 08.10.2014 03:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
140
2
145 311
16

Ответы 16

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

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

FWIW, в случае 404, IE возвращает свою стандартную страницу «не найден», если контент короткий (предполагается, что сервер просто говорит «не найден» и решает отобразить для пользователя более удобную страницу).

Serge Wautier 27.12.2011 18:06
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, и другие компьютеры / программы смогут правильно идентифицировать ответ как файл, который не найден.

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

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

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

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

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

14-летняя девочка или нет, но этот маленький глупый диалог действительно имел для меня смысл.

rbwhitaker 08.04.2012 23:20

Спасибо, сэр! Я наконец понял, почему PHP 404 работает, но не работает! :)) Я уже некоторое время боролся с этим.

Adi Ulici 16.11.2012 22:57

Stack Overflow необходимо добавить функциональность к +1 для стиля. Это получит все +1.

Jay Querido 01.02.2013 20:25

Вот как должна быть написана документация! Особенно документация по Apache, которую я ненавижу :)

Harry 05.03.2013 14:05

Больше ответов нужно писать так. +1 за диалог.

ChaseMoskal 24.06.2013 00:59

Почему php не может считывать документы по обработке ошибок и напрямую перенаправлять? Было бы так неприятно! Спасибо за ответ, дружище!

Noel Widmer 16.12.2013 12:29

чертовски блестяще объяснено! сделал мой день!

Andrei Cristian Prodan 03.03.2014 13:49

На моем PHP-сервере он работает отлично. заголовок ('HTTP / 1.0 404 Not Found'); возвращает страницу 404 сервера по умолчанию. Я предполагаю, что это можно настроить на сервере.

Elmue 08.10.2014 03:28

@Yrrol - По какой-то причине это не помечено как ответ в?

Jesse Chisholm 06.04.2015 18:30

Для всех людей, которые отмечают, что могут делать это на своем сервере. Nginx предоставляет параметр, который позволяет ему перехватывать состояние ошибки PHP и отправлять настроенную страницу ошибки. Он называется fastcgi_intercept_errors. Не уверен, что у apache есть эквивалентная настройка.

sg3s 12.10.2016 22:40

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

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

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

Если вы это сделаете, это также вернет 302. Лучше не перенаправляйте свои 404-е. вместо этого используйте код состояния 404 и отобразите сообщение «Не найдено».

Rocky 25.10.2012 11:02

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

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

он не работает, он показывает Предупреждение: readfile (404missing.html): не удалось открыть поток: нет такого файла или каталога в /var/www/.com/public_html/index1.php в строке 61

user1642018 12.01.2014 13:48

@AMB Это потому, что вам нужно создать этот файл самостоятельно.

Super Cat 06.01.2015 07:53

@SuperCat спасибо, теперь я перечитал ошибку и теперь все ясно.,

user1642018 06.01.2015 09: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;
}

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

потому что REQUEST_URI - это не то же самое, что PHP_SELF. Особенно, если у вас есть переписывание URL.

Timo Huovinen 30.11.2011 15:19

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

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

Он должен получить какой-то значок за худший ответ, который я видел на этом сайте.

MadTurki 09.03.2014 01:01

@MadTurki Есть намного хуже.

bjb568 19.04.2014 03:19

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

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

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

Нет, просто поместите эти вещи в начало файла, а затем перейдите к настраиваемой странице 404.

Silviu-Marian 11.09.2014 01:43

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

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

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

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

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

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

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

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

}

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

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

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

До свидания!

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

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

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

Другие вопросы по теме