Warum sendet meine PHP-App keinen 404-Fehler?

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

Warum funktioniert das nicht? Ich bekomme eine leere Seite.

Danorton
quelle
1
Eine bessere Option wäre, einen 404-Status zu senden und Ihre benutzerdefinierte 404-Seite sofort einzuschließen. Das habe ich früher gemacht.
Rocky
Auf meinem PHP-Server funktioniert es perfekt. Die obige Zeile gibt die Standard-404-Seite des Servers zurück. Ich nehme an, dass dies auf dem Server konfiguriert werden kann.
Elmue

Antworten:

306

Ihr Code ist technisch korrekt. Wenn Sie sich die Kopfzeilen dieser leeren Seite ansehen, sehen Sie eine 404-Kopfzeile, und andere Computer / Programme können die Antwort korrekt als nicht gefundene Datei identifizieren.

Natürlich sind Ihre Benutzer immer noch SOL. Normalerweise werden 404s vom Webserver verarbeitet.

  • Benutzer: Hey, hast du etwas für mich auf diesem URI-Webserver?
  • Webserver: Nein, ich nicht, 404! Hier ist eine Seite für 404s.

Das Problem ist, dass der Webserver, sobald er mit der Verarbeitung der PHP-Seite beginnt, bereits den Punkt überschritten hat, an dem er einen 404 verarbeiten würde

  • Benutzer: Hey, hast du etwas für mich auf diesem URI-Webserver?
  • Webserver: Ja, das ist eine PHP-Seite. Hier erfahren Sie, wie der Antwortcode lautet
  • PHP: Hey, OMG 404 !!!!!!!
  • Webserver: Na Mist, die Leute mit 404 Seiten sind schon nach Hause gegangen, also schicke ich einfach alles mit, was mir PHP gegeben hat

Zusätzlich zur Bereitstellung eines 404-Headers ist PHP jetzt für die Ausgabe der eigentlichen 404-Seite verantwortlich.

Alan Storm
quelle
49
14 Jahre altes Mädchen oder nicht, der kleine kitschige Dialog machte mir wirklich Sinn.
Rbwhitaker
20
PHP war damals 14
Adam Lynch
1
Der Stapelüberlauf muss +1 für den Stil um Funktionalität erweitern. Dies würde alle +1 bekommen.
Jay Querido
30
So sollte Dokumentation geschrieben werden! Besonders Apache-Dokumentation, die ich wirklich hasse :)
Harry
4
verdammt brillant erklärt! meinen Tag gerettet!
Andrei Cristian Prodan
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();
}

Wenn Sie sich die letzten beiden Echozeilen ansehen, sehen Sie dort den Inhalt. Sie können es anpassen, wie Sie möchten.

Evan Fosmark
quelle
74

Das ist korrektes Verhalten . Es liegt an Ihnen, den Inhalt für die 404-Seite zu erstellen.
Der 404-Header wird von Spider und Download-Managern verwendet, um festzustellen, ob die Datei vorhanden ist.
(Eine Seite mit einem 404-Header wird von Google oder anderen Suchmaschinen nicht indiziert.)

Normale Benutzer sehen sich jedoch keine http-Header an und verwenden die Seite als normale Seite.

Bob Fanger
quelle
20
FWIW, falls 404, gibt IE seine Standardseite "Nicht gefunden" zurück, wenn der Inhalt kurz ist (es wird davon ausgegangen, dass der Server nur "Nicht gefunden" sagt und beschließt, dem Benutzer eine schönere Seite anzuzeigen).
Serge Wautier
16

Für die Aufzeichnung ist dies der All-Case-Handler:

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
Silviu-Marian
quelle
ist die()erforderlich?
Daniel sagt Reinstate Monica
Nein, setzen Sie diese Dinge einfach oben in die Datei und fahren Sie mit einer benutzerdefinierten 404-Seite fort.
Silviu-Marian
14

Laden Sie die Standard-Server-404-Seite, falls Sie eine haben, z. B. für Apache definiert:

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}
Kitet
quelle
es funktioniert nicht, es zeigt Warnung: readfile (404missing.html): Stream konnte nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis in /var/www/.com/public_html/index1.php in Zeile 61
2
@AMB Das liegt daran, dass Sie diese Datei selbst erstellen müssen.
Super Cat
@ SuperCat danke, jetzt lese ich den Fehler noch einmal und alles ist jetzt klar.,
4

Eine andere Lösung, basierend auf @ 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);

Wenn Sie eine Website programmieren, die auf einem Server gehostet wird, über den Sie keine Kontrolle haben, wissen Sie nicht, welche Datei "404missing.html" ist. Sie können dies jedoch trotzdem tun.

Auf diese Weise haben Sie genau das gleiche Ergebnis einer normalen 404-Seite auf demselben Server bereitgestellt. Ein Beobachter kann nicht zwischen einer vorhandenen PHP-Seitenrückgabe 404 und einer nicht vorhandenen Seite unterscheiden.

Erdmotor
quelle
4

Versuche es mit:

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

Tschüss!

Olaf
quelle
2

Eine etwas kürzere Version. Unterdrücke ungerades Echo.

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

quelle
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;
}

Vereinfachen Sie niemals die Echo-Anweisungen und vergessen Sie niemals das Semikolon wie oben. Warum auch ein Substr auf der Seite ausführen? Wir können einfach nur php_self ausführen

Jesse
quelle
2
weil REQUEST_URI nicht mit PHP_SELF identisch ist. Vor allem, wenn Sie die URL neu schreiben.
Timo Huovinen
1

Wenn die Standardfehlerseite des Servers angezeigt werden soll, müssen Sie dies auf dem Server behandeln.

Gumbo
quelle
1

Du machst es richtig, obwohl es etwas verfeinert werden könnte. Sieht so aus, als wäre das behoben worden. Sprechen wir also über die praktischen Anwendungsvorteile:

Eine alte Website von uns, die eine große Sammlung mehrsprachiger technischer Dokumente enthält, führte dies in einer wenn sonst bedingten Bedingung aus:

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

Das Problem (neben der nicht hilfreichen Nachricht und der schlechten Benutzererfahrung) besteht darin, dass wir im Allgemeinen einen Linkcrawler (in unserem Fall Integrität) verwenden, um fehlerhafte Links und fehlende Dokumente zu überprüfen. Dies bedeutet, dass wir eine vollkommen korrekte 200-Fehler-Antwort erhalten haben, die uns mitteilt, dass dort eine Datei vorhanden ist. Integrity wusste nicht, dass wir ein PDF erwarten, also mussten wir manuell einen 404-Header mit PHP hinzufügen. Wenn Sie Ihren Code über dem Würfel hinzufügen (da danach nichts mehr ausgeführt werden würde und der Header ohnehin immer vor einem gerenderten HTML-Code stehen sollte), würde die Integrität (die sich mehr oder weniger wie ein Browser verhält) einen 404 zurückgeben und wir würden genau wissen, wo wir nach fehlenden suchen müssen Dateien. Es gibt elegantere Möglichkeiten, dem Benutzer mitzuteilen, dass ein Fehler vorliegt.

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

Versuche dies:

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();
}
Mohammad Farhoudi
quelle
0

Weißt du, auf meiner Website habe ich so etwas erstellt:

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

}

Ich hoffe es hilft dir.

GGG
quelle
-4

Ich bin auf dieses Problem gestoßen. Ich denke, dass das Umleiten zu einem nicht vorhandenen Link auf Ihrem Server den Trick tun könnte! Weil der Server seine 404 zurückgeben würde:
header('Redirect abbb.404.nonexist');<das existiert nicht sicher

GorillaApe
quelle
7
Das würde auch einen 302 zurückgeben, wenn Sie das tun. Leiten Sie Ihre 404 besser nicht um. Verwenden Sie stattdessen den Statuscode 404 und zeigen Sie die Meldung nicht gefunden an.
Rocky
-17

Wenn Sie die 404-Standardseite des Servers anzeigen möchten, können Sie sie in einen Frame wie den folgenden laden:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';
Zikade
quelle
4
Dies sollte eine Art Abzeichen für die schlechteste Antwort erhalten, die ich auf dieser Site gesehen habe.
MadTurki
1
@ MadTurki Es gibt viel schlimmer.
bjb568