it-swarm.com.de

Warum sendet meine PHP App keinen 404-Fehler?

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

Warum funktioniert das nicht? Ich bekomme eine leere Seite.

141
Yrrol

Ihr Code ist technisch korrekt. Wenn Sie sich die Überschriften dieser leeren Seite ansehen, sehen Sie eine 404-Überschrift, 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 irgendetwas für mich auf diesem URI-Webserver?
  • Webserver: Nein, ich nicht, 404! Hier ist eine Seite für 404s.

Das Problem besteht darin, dass der Webserver, sobald er mit der Verarbeitung der PHP=) - Seite beginnt, bereits den Punkt überschritten hat, an dem er eine 404 verarbeiten würde

  • Benutzer: Hey, hast du irgendetwas für mich auf diesem URI-Webserver?
  • Webserver: Ja, es handelt sich um eine PHP) Seite, auf der der Antwortcode angegeben wird
  • PHP: Hey, OMG 404 !!!!!!!
  • Webserver: Scheiße, die Leute mit 404 Seiten sind schon nach Hause gegangen, also schicke ich einfach was auch immer mir PHP) gegeben hat

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

306
Alan Storm
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 Echolinien ansehen, sehen Sie dort den Inhalt. Sie können es anpassen, wie Sie möchten.

78
Evan Fosmark

Das ist korrektes Verhalten, es liegt an Ihnen, den Inhalt für die 404-Seite zu erstellen.
Der 404-Header wird von Spidern 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.

74
Bob Fanger

Für den Datensatz 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 -->
16
Silviu-Marian

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

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}
14
Kitet

Seit PHP 5.4 können Sie jetzt http_response_code(404);

13
rparker

Eine andere Lösung, basierend auf @ Kitets.

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 die "404missing.html" ist. Sie können dies jedoch trotzdem tun.

Auf diese Weise haben Sie auf demselben Server genau das gleiche Ergebnis wie auf einer normalen 404-Seite erzielt. Ein Beobachter kann nicht zwischen einer vorhandenen PHP page return 404 und einer nicht vorhandenen page unterscheiden.

4
Earth Engine

versuche es mit:

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

Tschüss!

Eine etwas kürzere Version. Ungerades Echo unterdrücken.

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
artoodetoo
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, auch warum führen Sie ein substr auf der Seite aus, wir können einfach php_self ausführen

2
Jesse

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

Du machst es richtig, obwohl es etwas raffinierter sein könnte. Wie es aussieht, wurde dies behoben. Sprechen wir also über die praktischen Anwendungsvorteile:

Eine alte Website von uns, die eine große Sammlung mehrsprachiger technischer Dokumente enthält, hat dies unter folgenden Bedingungen ausgeführt:

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

Das Problem (neben der nicht hilfreichen Nachricht und der schlechten Benutzererfahrung) ist, dass wir im Allgemeinen einen Link-Crawler (in unserem Fall Integrität) verwenden, um fehlerhafte Links und fehlende Dokumente zu überprüfen. Dies bedeutet, dass wir eine vollkommen korrekte Antwort ohne Fehler erhalten haben, die uns mitteilt, dass sich dort eine Datei befindet. Integrity wusste nicht, dass wir ein PDF) erwartet hatten, also mussten wir manuell einen 404-Header mit PHP hinzufügen. Indem Sie Ihren Code über dem Würfel hinzufügen (da nichts danach ausgeführt werden würde und der Header immer sein sollte) Vor jedem gerenderten HTML-Code würde die Integrität (die sich mehr oder weniger wie ein Browser verhält) eine 404 zurückgeben und wir würden genau wissen, wo nach fehlenden Dateien zu suchen ist. Es gibt elegantere Möglichkeiten, dem Benutzer mitzuteilen, dass ein Fehler vorliegt, aber Indem Sie einen 404-Fehler melden, benachrichtigen Sie nicht nur Browser und browserähnliche Programme über den Fehler, sondern (ich glaube, korrigieren mich, wenn ich mich irre) zeichnen auch diese Fehler in Ihren Server-Protokollen auf, in denen Sie problemlos nach 404-Fehlern suchen können.

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

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

1
Gumbo

Wissen Sie, 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.

0
GGG