Jak mogę utworzyć błąd 404 w PHP?

111

Mój .htaccess przekierowuje wszystkie żądania /word_heredo /page.php?name=word_here. Następnie skrypt PHP sprawdza, czy żądana strona znajduje się w swojej tablicy stron.

Jeśli nie, jak mogę zasymulować błąd 404? Próbowałem to, ale to nie spowodowało w moim 404 skonfigurowanym przez ErrorDocumentw .htaccesswyświetlane.

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

Czy mam rację myśląc, że przekierowywanie na stronę błędu 404 jest niewłaściwe?

Eric
źródło
Dlaczego masz na myśli to, że to nie działa? Czy sprawdziłeś nagłówek odpowiedzi serwera?
Gumbo
1
Odpowiadając na Twoje końcowe pytanie: tak, przekierowanie wszystkich 404 na prawdziwą stronę byłoby złym pomysłem. To narusza specyfikację HTTP, zmieniając coś, czego nie powinno tam być, w coś, co tam jest.
Lucas Oman

Odpowiedzi:

157

Aktualną odpowiedzią (od PHP 5.4 lub nowszą) do generowania stron 404 jest użycie http_response_code:

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

die() nie jest absolutnie konieczne, ale zapewnia, że ​​nie będziesz kontynuować normalnego wykonywania.

nóż
źródło
w którym pliku mam to dodać?
Julfikar
87

To, co robisz, zadziała, a przeglądarka otrzyma kod 404. Co to nie będzie zrobić, to wyświetla „not found” stronę, która może pojawić się spodziewa, np:

Nie znaleziono

Żądanego adresu URL /test.php nie znaleziono na tym serwerze.

Dzieje się tak, ponieważ serwer WWW nie wysyła tej strony, gdy PHP zwraca kod 404 (przynajmniej Apache tego nie robi). PHP jest odpowiedzialne za wysyłanie własnego wyjścia. Więc jeśli chcesz mieć podobną stronę, musisz sam wysłać kod HTML, np:

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

Możesz skonfigurować Apache, aby używał tej samej strony dla swoich własnych komunikatów 404, umieszczając to w httpd.conf:

ErrorDocument 404 /notFound.php
JW.
źródło
Dzięki. Zakładałem, że użył mojej strony 404.
Eric
@JW gdzie będzie używany powyższy kod? to kod pliku „.htaccess”.
Manohar Kumar
@ManoharKumar powyższy kod użyj w którym chcesz wysłać stronę 404. W moim przypadku użyłem, gdy ktoś szuka elementu z jego kodem, ale go nie ma. więc używam powyższego kodu po stwierdzeniu, że pozycja nie jest dostępna i użyłem też exit w trzeciej linii tego kodu, aby uniknąć ładowania czegokolwiek po stronie 404. dziękuję JW, u mnie zadziałało doskonale.
Harsha
22

Spróbuj tego:

<?php
header("HTTP/1.0 404 Not Found");
?>
Ates Goral
źródło
3
Cóż, 404 to 404 zarówno w HTTP 1.0, jak i 1.1. 1.0 to bezpieczny zakład. Przy okazji fajny żart :) +1
Ates Goral
w moim przypadku muszę podać nagłówek („Lokalizacja: HTTP / 1.0 404 nie znaleziono”);
The EasyLearn Academy
9

Utwórz niestandardowe strony błędów za pomocą pliku .htaccess

1. 404 - nie znaleziono strony

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Wewnętrzny błąd serwera

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Zabronione

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Złe żądanie

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Wymagana autoryzacja

RewriteEngine On
ErrorDocument 401 /401.html

Możesz także przekierować wszystkie błędy na pojedynczą stronę. lubić

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
Irshad Khan
źródło
RewriteEngine nie ma z tym nic wspólnego; tę linię można bezpiecznie pominąć, aby osiągnąć ten sam wynik.
WoodrowShigeru
3

Czy pamiętałeś, aby umrzeć () po wysłaniu nagłówka? Nagłówek 404 nie zatrzymuje automatycznie przetwarzania, więc może się wydawać, że nic nie zrobił, jeśli ma miejsce dalsze przetwarzanie.

Nie jest dobrze PRZEKIEROWAĆ na swoją stronę 404, ale możesz DOŁĄCZAĆ jej zawartość bez problemu. W ten sposób masz stronę, która poprawnie wysyła stan 404 z poprawnego adresu URL, ale zawiera również Twoje „czego szukasz?” strona dla czytelnika.

Eli
źródło
0

spróbuj umieścić

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

w .htaccesspliku.

Zrób to dla dowolnego błędu, ale zamień 404 na swój błąd.

czerwony crafteryt
źródło
0

W Drupal lub Wordpress CMS (i prawdopodobnie innych), jeśli próbujesz sprawić, by jakiś niestandardowy kod php wyglądał na nieistniejący (chyba że spełniony jest jakiś warunek), poniższe działa dobrze, przejmując obsługę 404 CMS:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>
Mike Godin
źródło
-2

Zaraz po tym wierszu spróbuj zamknąć odpowiedź za pomocą exitlubdie()

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

lub

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
user5891645
źródło
1
Jeśli to zrobisz, użytkownik zobaczy pustą stronę. Moje pytanie brzmiało, jak wysłać tę samą stronę 404, którą podałem ErrorDocument, ale z PHP.
Eric
jeśli chcesz użyć ErrorDocument Upewnij się, że ścieżka do twojego niestandardowego pliku błędu jest zgodna z katalogiem głównym serwera Przykład: powiedz, że twoja wirtualna ścieżka to / folder1 / folder2 / myhtaccess z katalogu głównego serwera twój błąd będzie wyglądał mniej więcej tak ErrorDocument 404 /folder1/folder2/my404.html
user5891645
ErrorDocumentnie działa po wprowadzeniu kodu PHP. ta odpowiedź najlepiej wyjaśnia zamieszanie, z którym miałem do czynienia 9 lat temu
Eric,
Mam nadzieję, że twój problem został już rozwiązany. Jeśli chodzi o inny temat, myślę, że lepiej nie przekierowywać za pomocą? Name = word_here. Zamiast tego użyj $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");w swoim pliku page.php. Ponieważ istnieje scenariusz, w którym jedna z tych stron oczekuje od użytkownika zapytania „nazwa”.
user5891645
-2

spróbuj tego raz.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Mani Kandan
źródło