Wie kann ich einen Fehler 404 in PHP erstellen?

110

Mein .htaccess leitet alle Anfragen an /word_hereweiter/page.php?name=word_here . Das PHP-Skript prüft dann, ob sich die angeforderte Seite in ihrem Seitenarray befindet.

Wenn nicht, wie kann ich einen Fehler 404 simulieren? Ich habe es versucht, aber es hat nicht dazu geführt, dass meine 404-Seite über ErrorDocumentin der .htaccessAnzeige konfiguriert wurde.

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

Habe ich Recht, wenn ich denke, dass es falsch ist, auf meine Fehlerseite 404 umzuleiten?

Eric
quelle
Warum meinst du, dass es nicht funktioniert? Haben Sie den Server-Antwortheader überprüft?
Gumbo
1
Als Antwort auf Ihre abschließende Frage: Ja, es wäre eine schlechte Idee, alle 404 auf eine echte Seite umzuleiten. Dies verstößt gegen die HTTP-Spezifikation, indem etwas, das nicht vorhanden sein sollte, in etwas umgewandelt wird, das vorhanden ist.
Lucas Oman

Antworten:

155

Die aktuelle Antwort (ab PHP 5.4 oder neuer) zum Generieren von 404 Seiten lautet http_response_code:

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

die() ist nicht unbedingt erforderlich, stellt jedoch sicher, dass Sie die normale Ausführung nicht fortsetzen.

Klinge
quelle
In welcher Datei soll ich das hinzufügen?
Julfikar
87

Was Sie tun, funktioniert und der Browser erhält einen 404-Code. Was wird es nicht tun wird, ist die Seite "nicht gefunden" anzuzeigen, die Sie möglicherweise erwarten, z.

Nicht gefunden

Die angeforderte URL /test.php wurde auf diesem Server nicht gefunden.

Dies liegt daran, dass der Webserver diese Seite nicht sendet, wenn PHP einen 404-Code zurückgibt (zumindest Apache nicht). PHP ist für das Senden aller eigenen Ausgaben verantwortlich. Wenn Sie also eine ähnliche Seite möchten, müssen Sie den HTML-Code selbst senden, z.

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

Sie können Apache so konfigurieren, dass dieselbe Seite für seine eigenen 404-Nachrichten verwendet wird, indem Sie dies in httpd.conf einfügen:

ErrorDocument 404 /notFound.php
JW.
quelle
Vielen Dank. Ich hatte angenommen, dass meine 404-Seite verwendet wurde.
Eric
@JW wo wird der obige Code verwendet? ist dieser Code für die Datei '.htaccess'.
Manohar Kumar
@ManoharKumar über Code verwenden, wo Sie 404 Seite senden möchten. In meinem Fall habe ich verwendet, wenn jemand nach einem Element mit seinem Code sucht, aber es existiert nicht. Daher verwende ich den obigen Code, nachdem ich herausgefunden habe, dass das Element nicht verfügbar ist, und ich habe auch exit in der 3. Zeile dieses Codes verwendet, um zu vermeiden, dass nach 404 Seiten etwas geladen wird. Danke JW, es hat perfekt für mich funktioniert.
Harsha
22

Versuche dies:

<?php
header("HTTP/1.0 404 Not Found");
?>
Ates Goral
quelle
3
Nun, ein 404 ist ein 404 sowohl in HTTP 1.0 als auch in 1.1. 1.0 ist eine sichere Wette. Cooler Witz übrigens :) +1
Ates Goral
in meinem Fall muss ich einen Header angeben ("Location: HTTP / 1.0 404 Not Found");
Die EasyLearn Academy
9

Erstellen Sie benutzerdefinierte Fehlerseiten über die .htaccess-Datei

1. 404 - Seite nicht gefunden

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Interner Serverfehler

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Verboten

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Schlechte Anfrage

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Autorisierung erforderlich

RewriteEngine On
ErrorDocument 401 /401.html

Sie können auch alle Fehler auf eine einzelne Seite umleiten. mögen

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
Irshad Khan
quelle
Die RewriteEngine hat damit nichts zu tun; Diese Zeile kann sicher weggelassen werden, um das gleiche Ergebnis zu erzielen.
WoodrowShigeru
3

Haben Sie daran gedacht, nach dem Senden des Headers zu sterben ()? Der 404-Header stoppt die Verarbeitung nicht automatisch, sodass er möglicherweise nichts getan hat, wenn eine weitere Verarbeitung stattfindet.

Es ist nicht gut, auf Ihre 404-Seite umzuleiten, aber Sie können den Inhalt problemlos einschließen. Auf diese Weise haben Sie eine Seite, die ordnungsgemäß einen 404-Status von der richtigen URL sendet, aber auch Ihre "Was suchen Sie?" Seite für den menschlichen Leser.

Eli
quelle
0

versuche es

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

in .htaccessDatei.

Tun Sie dies für jeden Fehler, aber ersetzen Sie Ihren Fehler durch 404.

das rote crafteryt
quelle
0

Wenn Sie im Drupal- oder Wordpress-CMS (und wahrscheinlich auch in anderen) versuchen, einen benutzerdefinierten PHP-Code als nicht vorhanden erscheinen zu lassen (es sei denn, eine bestimmte Bedingung ist erfüllt), funktioniert Folgendes gut, indem der 404-Handler des CMS übernommen wird:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>
Mike Godin
quelle
-2

Versuchen Sie unmittelbar nach dieser Zeile, die Antwort mit exitoder zu schließendie()

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

oder

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
user5891645
quelle
1
In diesem Fall wird dem Benutzer eine leere Seite angezeigt. Meine Frage war, wie ich dieselbe 404-Seite senden soll, mit der ich angegeben habe ErrorDocument, jedoch über PHP.
Eric
Wenn Sie ErrorDocument verwenden möchten Stellen Sie sicher, dass sich der Pfad zu Ihrer benutzerdefinierten Fehlerdatei auf das Stammverzeichnis des Servers bezieht. Beispiel: Ihr virtueller Pfad lautet / folder1 / folder2 / myhtaccess vom Stammverzeichnis des Servers. Ihr Fehlerdokument sieht ungefähr so ​​aus ErrorDocument 404 /folder1/folder2/my404.html
user5891645
ErrorDocumenthat keine Auswirkung, nachdem Sie den PHP-Code bereits eingegeben haben. Diese Antwort erklärt am besten die Verwirrung, mit der ich vor 9 Jahren
Eric
Ich hoffe, Ihr Problem ist jetzt gelöst. Ich denke, es ist besser, wenn Sie nicht mit? Name = word_here umgeleitet haben. Verwenden $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");Sie stattdessen in Ihrer page.php-Datei. Weil es ein Szenario gibt, in dem eine dieser Seiten eine Abfrage "Name" vom Benutzer erwartet.
user5891645
-2

versuchen Sie dies einmal.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Mani Kandan
quelle