Чому мій додаток PHP не надішле помилку 404?


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

Чому не хочеться ця робота? Я отримую порожню сторінку.


1
Кращим варіантом буде надіслати статус 404 та негайно включити власну сторінку 404. Ось що я раніше робив.
Rocky

На моєму сервері PHP він працює чудово. Вищенаведений рядок повертає 404 сторінку сервера за замовчуванням. Я припускаю, що це можна налаштувати на сервері.
Елмуе

Відповіді:


306

Ваш код технічно правильний. Якщо ви подивитеся на заголовки цієї порожньої сторінки, ви побачите заголовок 404, а інші комп’ютери / програми зможуть правильно ідентифікувати відповідь як файл, який не знайдено.

Звичайно, ваші користувачі все ще SOL. Зазвичай веб-сервер обробляє 404.

  • Користувач: Гей, чи є у мене щось на цьому веб-сервері URI?
  • Веб-сервер: Ні, я не 404! Ось сторінка для відображення 404s.

Проблема полягає в тому, що після того, як веб-сервер починає обробляти сторінку PHP, він вже пройшов точку, де він буде обробляти 404

  • Користувач: Гей, чи є у мене щось на цьому веб-сервері URI?
  • Веб-сервер: Так, це я, це сторінка PHP. Він розповість, що таке код відповіді
  • PHP: Гей, OMG 404 !!!!!!!
  • Веб-сервер: Добре лайно, люди на 404 сторінці вже пішли додому, тому я просто надішлю те, що мені дав PHP

Крім надання заголовка 404, PHP тепер відповідає за виведення фактичної сторінки 404.


49
14-річна дівчинка чи ні, маленький сирний діалог дійсно мав сенс для мене.
rbwhitaker

20
PHP тоді був 14
Адам Лінч

1
Переповнення стека потрібно додати функціональність +1 для стилю. Це отримає всі +1.
Jay Querido

30
Ось так має бути написана документація! Особливо документація Apache, яку я справді ненавиджу :)
Гаррі

4
криваво блискуче пояснив! зробив мій день!
Андрій Крістіан Продан

78
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

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

Однак звичайні користувачі не дивляться на заголовки http і використовують сторінку як звичайну сторінку.


20
FWIW, у випадку 404, IE повертає свою стандартну сторінку "не знайдено", якщо вміст короткий (передбачається, що сервер просто говорить "не знайдено" і вирішує відобразити користувачеві приємну сторінку).
Серж Вотьє

16

Для запису, це обробник всіх випадків:

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

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


Ні, просто помістіть ці речі у верхню частину файлу, а потім перейдіть до спеціальної сторінки 404.
Сільвіу-Маріан

14

Завантажте сторінку 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

2
@AMB Це тому, що ви повинні створити цей файл самостійно.
Супер Кіт

@SuperCat спасибі, зараз я перечитував помилку і зараз все зрозуміло.,


4

Ще одне рішення, засноване на @ 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 на тому ж сервері. Спостерігач не зможе розрізнити існуючу сторінку повернення 404 PHP та неіснуючу сторінку.


4

спробуйте:

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

До побачення!


2

Трохи коротша версія. Придушити дивне відлуння.

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

2
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


2
тому що REQUEST_URI - не те саме, що PHP_SELF. Особливо, якщо у вас є перезапис URL-адрес.
Тімо Хуовінен

1

Якщо ви хочете, щоб на сторінці відображалася сторінка помилок за замовчуванням, вам потрібно це обробити на сервері.


1

Ви робите це правильно, хоча це може використати певне очищення. Схоже, це було вирішено, тому поговоримо про практичні переваги застосування:

Старий наш веб-сайт, який має велику колекцію багатомовних технічних документів, виконував це всередині, якщо не умовно:

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

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

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

1

Спробуйте це:

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

0

Знаєте, на моєму веб-сайті я створив щось подібне:

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

}

Я сподіваюся, що це допоможе тобі.


-4

Я підійшов до цієї проблеми .. Я думаю, що перенаправлення на неіснуюче посилання на вашому сервері може зробити свою справу! Тому що сервер поверне свої 404:
header('Redirect abbb.404.nonexist');<, що точно не існує


7
Це також поверне 302, якщо ви це зробите. Краще не перенаправляйте свої 404. замість цього використовуйте код стану 404 та відображайте не знайдене повідомлення.
Rocky

-17

Якщо ви хочете показати серверну сторінку 404 за замовчуванням, ви можете завантажити її в такий кадр:

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

4
Це має отримати якийсь знак для найгіршої відповіді, яку я бачив на цьому сайті.
MadTurki

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.