Come posso creare un errore 404 in PHP?


111

Il mio .htaccess reindirizza tutte le richieste /word_herea /page.php?name=word_here. Lo script PHP controlla quindi se la pagina richiesta è nel suo array di pagine.

In caso contrario, come posso simulare un errore 404? Ho provato questo, ma non ha determinato la mia pagina 404 configurato tramite ErrorDocumentnel .htaccesspresentarsi.

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

Ho ragione a pensare che sia sbagliato reindirizzare alla mia pagina di errore 404?


Perché intendi che non funziona? Hai controllato l'intestazione della risposta del server?
Gumbo

1
In risposta alla tua domanda conclusiva, sì, sarebbe una cattiva idea reindirizzare tutti i 404 a una pagina reale. Ciò viola le specifiche HTTP trasformando qualcosa che non dovrebbe essere lì in qualcosa che è lì.
Lucas Oman

Risposte:


157

La risposta aggiornata (a partire da PHP 5.4 o più recente) per la generazione di pagine 404 consiste nell'usare http_response_code:

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

die() non è strettamente necessario, ma fa in modo che tu non continui la normale esecuzione.


in quale file devo aggiungerlo?
Julfikar

87

Quello che stai facendo funzionerà e il browser riceverà un codice 404. Quello che non farà è visualizzare la pagina "non trovato" che potresti aspettarti, ad esempio:

Non trovato

L'URL richiesto /test.php non è stato trovato su questo server.

Questo perché il server web non invia quella pagina quando PHP restituisce un codice 404 (almeno Apache non lo fa). PHP è responsabile dell'invio di tutto il proprio output. Quindi, se desideri una pagina simile, dovrai inviare tu stesso l'HTML, ad esempio:

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

È possibile configurare Apache per utilizzare la stessa pagina per i propri messaggi 404, inserendolo in httpd.conf:

ErrorDocument 404 /notFound.php

Grazie. Avevo pensato che usasse la mia pagina 404.
Eric,

@JW dove verrà utilizzato il codice sopra? è quel codice per il file ".htaccess".
Manohar Kumar

@ManoharKumar sopra il codice da utilizzare nel punto in cui si desidera inviare la pagina 404. Nel mio caso, ho usato quando qualcuno cerca un articolo con il suo codice, ma non esisteva. quindi uso il codice sopra dopo aver scoperto che l'elemento non è disponibile e ho usato anche exit sulla 3a riga di questo codice, per evitare di caricare qualsiasi cosa dopo la pagina 404. grazie JW, ha funzionato perfettamente per me.
Harsha

22

Prova questo:

<?php
header("HTTP/1.0 404 Not Found");
?>

3
Ebbene, un 404 è un 404 sia in HTTP 1.0 che in 1.1. 1.0 è una scommessa sicura. Fantastica battuta BTW :) +1
Ates Goral

nel mio caso devo fornire l'header ("Location: HTTP / 1.0 404 Not Found");
The EasyLearn Academy

9

Crea pagine di errore personalizzate tramite il file .htaccess

1. 404 - pagina non trovata

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Errore interno del server

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Vietato

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Cattiva richiesta

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Autorizzazione richiesta

RewriteEngine On
ErrorDocument 401 /401.html

Puoi anche reindirizzare tutti gli errori a una singola pagina. piace

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html

Il RewriteEngine non ha nulla a che fare con questo; quella riga può essere tranquillamente omessa per ottenere lo stesso risultato.
Woodrow Shigeru

3

Ti sei ricordato di morire () dopo aver inviato l'intestazione? L'intestazione 404 non interrompe automaticamente l'elaborazione, quindi potrebbe sembrare che non abbia fatto nulla se è in corso un'ulteriore elaborazione.

Non va bene REINDIRIZZARE alla tua pagina 404, ma puoi INCLUDERE il contenuto senza problemi. In questo modo, hai una pagina che invia correttamente uno stato 404 dall'URL corretto, ma ha anche il tuo "cosa stai cercando?" pagina per il lettore umano.


0

prova a mettere

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

in .htaccessfile.

Fallo per qualsiasi errore ma sostituisci 404 per il tuo errore.


0

Nel CMS Drupal o Wordpress (e probabilmente altri), se stai cercando di far sembrare che del codice php personalizzato non esista (a meno che non venga soddisfatta una condizione), quanto segue funziona bene facendo subentrare il gestore 404 del CMS:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>

-2

Subito dopo quella riga, provare a chiudere la risposta utilizzando exitodie()

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

o

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

1
Se lo fai, l'utente vede una pagina vuota. La mia domanda era come inviare la stessa pagina 404 con cui ho specificato ErrorDocument, ma da PHP.
Eric

se vuoi usare ErrorDocument Assicurati che il percorso del tuo file di errore personalizzato sia rispetto alla radice dell'esempio del server: supponi che il tuo percorso virtuale sia / cartella1 / cartella2 / myhtaccess dalla radice del server il tuo documento di errore sarà simile a questo ErrorDocument 404 /folder1/folder2/my404.html
user5891645

ErrorDocumentnon ha alcun effetto dopo aver già inserito il codice PHP. questa risposta spiega al meglio la confusione che ho dovuto affrontare 9 anni fa
Eric il

Spero che il tuo problema sia risolto ormai. In un soggetto diverso, penso sia meglio che tu non abbia reindirizzato con? Name = word_here. Invece, usa $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");nel tuo file page.php. Perché c'è uno scenario in cui una di quelle pagine si aspetta un "nome" di query da parte dell'utente.
user5891645

-2

provalo una volta.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
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.