if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Perché non funziona? Ottengo una pagina vuota.
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Perché non funziona? Ottengo una pagina vuota.
Risposte:
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.
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
Oltre a fornire un'intestazione 404, PHP è ora responsabile dell'output della pagina 404 effettiva.
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.
È 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.
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 -->
die()
richiesto?
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();
}
Da php 5.4 ora puoi farlo http_response_code(404);
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.
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.");
}
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
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");
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();
}
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: "".$_SERVER['REQUEST_URI']."", 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.
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
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>';