Як я можу створити помилку 404 у PHP?


111

Мій .htaccess перенаправляє всі запити /word_hereдо /page.php?name=word_here. Потім скрипт PHP перевіряє, чи потрібна сторінка знаходиться у своєму масиві сторінок.

Якщо ні, як я змоделюю помилку 404? Я спробував це, але це не призвело до того, що на моїй сторінці 404 було налаштовано за ErrorDocumentдопомогою .htaccessпоказу.

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

Я маю рацію, думаючи, що неправильно перенаправляти на свою сторінку 404 помилки?


Чому ти означає, що це не працює? Ви перевірили заголовок відповіді сервера?
Gumbo

1
Відповідаючи на ваше заключне запитання, так, було б поганою ідеєю перенаправити всі 404 на реальну сторінку. Це порушує специфікацію HTTP, перетворюючи щось, що не повинно бути там, у те, що є.
Лукас Оман

Відповіді:


157

Актуальною відповіддю (на PHP 5.4 або новішої версії) для створення 404 сторінок є використання http_response_code:

<?php
http_response_code(404);
include('my_404.php'); // provide your own HTML for the error page
die();

die() суворо не потрібно, але це гарантує, що ви не продовжуєте нормальне виконання.


в який файл я повинен додати це?
Julfikar

87

Те, що ви робите, буде працювати, і браузер отримає код 404. Що він не зробить - це відображення сторінки "не знайдено", яку ви могли очікувати, наприклад:

Не знайдено

Запрошена URL-адреса /test.php не знайдена на цьому сервері.

Це тому, що веб-сервер не надсилає цю сторінку, коли PHP повертає код 404 (принаймні Apache не робить). PHP відповідає за надсилання всього власного результату. Отже, якщо ви хочете схожу сторінку, вам доведеться відправити HTML самостійно, наприклад:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

Ви можете налаштувати Apache на ту саму сторінку для своїх 404 повідомлень, помістивши це в httpd.conf:

ErrorDocument 404 /notFound.php

Дякую. Я припускав, що він використовував мою сторінку 404.
Ерік

@JW, де буде використаний вищезазначений код? це код для файлу ".htaccess".
Манохар Кумар

@ManoharKumar, наведений вище, використовуйте код, куди потрібно відправити сторінку 404. У моєму випадку я використовував, коли хтось шукав предмет з кодом, але його не існувало. тому я використовую наведений вище код, коли дізнаюся, що цей пункт недоступний, і я використав також вихід у третьому рядку цього коду, щоб уникнути нічого після 404 сторінки. дякую, JW, це справно працювало для мене.
Харша

22

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

<?php
header("HTTP/1.0 404 Not Found");
?>

3
Ну а 404 - це 404 як у HTTP 1.0, так і 1.1. 1,0 - безпечна ставка. Класний жарт BTW :) +1
Ates Goral

у моєму випадку я повинен дати заголовок ("Місцезнаходження: HTTP / 1.0 404 не знайдено");
Академія EasyLearn

9

Створіть власні сторінки помилок через .htaccess файл

1. 404 - сторінка не знайдена

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Внутрішня помилка сервера

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Заборонено

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Неправильний запит

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Потрібна авторизація

RewriteEngine On
ErrorDocument 401 /401.html

Ви також можете перенаправити всю помилку на одну сторінку. подібно до

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html

RewriteEngine не має нічого спільного з цим; ця лінія може бути безпечно пропущена для досягнення того ж результату.
WoodrowShigeru

3

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

Непогано ПОВЕРНУТИСЯ до вашої сторінки 404, але ви можете ВКЛЮЧИТИ вміст із неї без проблем. Таким чином, у вас є сторінка, яка належним чином надсилає статус 404 з правильної URL-адреси, але вона також має "що ви шукаєте?" сторінка для людського читача.


0

спробуйте поставити

ErrorDocument 404 /(root directory)/(error file) 

у .htaccessфайл.

Зробіть це для будь-якої помилки, але замініть 404 на свою помилку.


0

У CMS для Drupal або Wordpress (і, ймовірно, інших), якщо ви намагаєтесь зробити так, щоб якийсь нестандартний php-код не існував (якщо не виконано якусь умову), наступне працює добре, змушуючи переробляти обробник 404 CMS:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>

-2

Відразу після цього рядка спробуйте закрити відповідь, використовуючи exitабоdie()

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

або

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

1
Якщо ви це зробите, користувач бачить порожню сторінку. Моє запитання полягало в тому, як надіслати ту саму сторінку 404, яку я вказав ErrorDocument, але з PHP.
Ерік

якщо ви хочете використовувати ErrorDocument Переконайтеся, що шлях до вашого користувальницького файлу помилок стосується кореня прикладу сервера: скажіть, що ваш віртуальний шлях є / folder1 / folder2 / myhtaccess fromt він корінь сервера, ваш errordocument буде виглядати приблизно так ErrorDocument 404 /folder1/folder2/my404.html
user5891645

ErrorDocumentне робить жодного ефекту після того, як ви вже ввели код PHP. ця відповідь найкраще пояснює плутанину, з якою я зіткнувся 9 років тому
Ерік

Я сподіваюся, що ваша проблема вирішена на даний момент. Що стосується суттєвої теми, я думаю, що краще, щоб ви не переспрямовували з? Name = word_here. Замість цього використовуйте $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");у файлі page.php. Тому що існує сценарій, коли одна з цих сторінок очікує від користувача запиту "ім'я".
користувач5891645

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