Perché la mia app PHP non invierà un errore 404?


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

Perché non funziona? Ottengo una pagina vuota.


1
Un'opzione migliore sarebbe quella di inviare uno stato 404 e includere immediatamente la tua pagina 404 personalizzata. Questo è quello che facevo.
Rocky,

Sul mio server PHP funziona perfettamente. La riga sopra restituisce la pagina 404 predefinita del server. Suppongo che questo possa essere configurato nel server.
Elmue,

Risposte:


306

Il tuo codice è tecnicamente corretto. Se guardassi le intestazioni di quella pagina vuota, vedresti un'intestazione 404 e altri computer / programmi sarebbero in grado di identificare correttamente la risposta come file non trovato.

Certo, i tuoi utenti sono ancora SOL. Normalmente, i 404 sono gestiti dal server web.

  • Utente: Ehi, hai qualcosa per me in questo server web URI?
  • Webserver: No, io no, 404! Ecco una pagina da visualizzare per 404 secondi.

Il problema è che, una volta che il server Web inizia a elaborare la pagina PHP, ha già superato il punto in cui gestirà un 404

  • Utente: Ehi, hai qualcosa per me in questo server web URI?
  • Webserver: Sì, è una pagina PHP. Ti dirà qual è il codice di risposta
  • PHP: Ehi, OMG 404 !!!!!!!
  • Webserver: Beh, merda, le 404 pagine sono già andate a casa, quindi invierò qualunque cosa PHP mi abbia dato

Oltre a fornire un'intestazione 404, PHP è ora responsabile dell'output della pagina 404 effettiva.


49
Ragazza di 14 anni o no, il piccolo dialogo di cattivo gusto ha davvero avuto senso per me.
rbwhitaker,

20
PHP aveva 14 anni allora
Adam Lynch il

1
Stack Overflow deve aggiungere funzionalità a +1 per lo stile. Ciò otterrebbe tutti i +1.
Jay Querido,

30
Ecco come dovrebbe essere scritta la documentazione! Soprattutto la documentazione di Apache, che odio davvero :)
Harry

4
sanguinosamente spiegato brillantemente! ha reso la mia giornata!
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();
}

Se guardi le ultime due linee di eco, è lì che vedrai il contenuto. Puoi personalizzarlo come preferisci.


74

È un comportamento corretto , sta a te creare i contenuti per la pagina 404.
L'intestazione 404 viene utilizzata da spider e gestori di download per determinare se il file esiste.
(Una pagina con un'intestazione 404 non verrà indicizzata da Google o da altri motori di ricerca)

Gli utenti normali tuttavia non guardano le intestazioni http e usano la pagina come una pagina normale.


20
FWIW, in caso di 404, IE restituisce la sua pagina 'non trovata' standard se il contenuto è breve (presuppone che il server stia semplicemente dicendo 'non trovata' e decide di visualizzare una pagina migliore per l'utente).
Serge Wautier,

16

Per la cronaca, questo è il gestore per tutti i casi:

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->


No, metti queste cose in cima al file, quindi procedi con una pagina 404 personalizzata.
Silviu-Marian,

14

Carica la pagina predefinita del server 404, se ne hai una, ad esempio definita per apache:

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

non funziona, mostra Attenzione: readfile (404missing.html): impossibile aprire il flusso: nessun file o directory in /var/www/.com/public_html/index1.php sulla riga 61

2
@AMB Questo perché devi creare quel file da solo.
Super Cat

@SuperCat grazie, ora rileggo l'errore e ora tutto è chiaro.,


4

Un'altra soluzione, basata su @ 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);

Se stai programmando un sito Web ospitato su un server che non hai controllo, non saprai quale file è "404missing.html". Tuttavia puoi ancora farlo.

In questo modo, hai fornito esattamente lo stesso risultato di una normale pagina 404 sullo stesso server. Un osservatore non sarà in grado di distinguere tra una pagina PHP esistente che restituisce 404 e una pagina inesistente.


4

prova con:

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

Ciao!


2

Una versione un po 'più corta. Sopprime l'eco dispari.

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

non semplificare mai le istruzioni echo e non dimenticare mai i punti e virgola come sopra, anche perché eseguire un substr sulla pagina, possiamo semplicemente eseguire php_self


2
perché REQUEST_URI non è uguale a PHP_SELF. Soprattutto se hai la riscrittura degli URL.
Timo Huovinen,

1

Se si desidera visualizzare la pagina di errore predefinita del server, è necessario gestirla nel server.


1

Lo stai facendo bene anche se potrebbe usare un po 'di raffinazione. Sembra che sia stato risolto, quindi parliamo dei vantaggi pratici dell'applicazione:

Un nostro vecchio sito Web che ha una vasta collezione di documenti tecnici multilingue stava eseguendo questo in un altro se condizionato:

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

Il problema (oltre al messaggio inutile e alla cattiva esperienza dell'utente) è che generalmente utilizziamo un crawler di link (nel nostro caso integrità) per verificare link non validi e documenti mancanti. Ciò significa che stavamo ottenendo una risposta 200 senza errori perfettamente corretta che ci diceva che c'era un file lì. L'integrità non sapeva che ci aspettavamo un PDF, quindi abbiamo dovuto aggiungere manualmente un'intestazione 404 con php. Aggiungendo il codice sopra il dado (perché in seguito non verrebbe eseguito nulla e l'intestazione dovrebbe sempre essere prima di qualsiasi html renderizzato comunque), l'integrità (che si comporta più o meno come un browser) restituirebbe un 404 e sapremmo esattamente dove cercare i mancanti File. Esistono modi più eleganti per dire all'utente che c'è un errore,

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

1

Prova questo:

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

0

Sai, nel mio sito web ho creato qualcosa del genere:

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

}

spero che ti aiuti.


-4

Sono venuto a questo problema .. Penso che il reindirizzamento a un collegamento inesistente sul tuo server potrebbe fare il trucco! Perché il server restituirà il suo 404:
header('Redirect abbb.404.nonexist');<che non esiste per certo


7
Ciò restituirebbe anche un 302 se lo fai. Meglio non reindirizzare i tuoi 404. utilizzare invece il codice di stato 404 e visualizzare il messaggio non trovato.
Rocky,

-17

Se vuoi mostrare la pagina 404 predefinita del server, puoi caricarla in un frame come questo:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';

4
Questo dovrebbe ricevere una sorta di badge per la peggior risposta che ho visto su questo sito.
MadTurki

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.