2012-06-21 10 views
11

Desidero visualizzare un errore 404 se un utente raggiunge una pagina che esiste ma non la voglio vedere.PHP - Visualizza un errore 404 senza reindirizzamento a un'altra pagina

Io non voglio fare redirect (che causerebbe la barra degli indirizzi per mostrare il link della pagina di errore nella barra degli indirizzi) come la seguente:

if ($this_page_should_not_be_seen) 
    header("Location: err.php?e=404"); 

Invece, dovrebbe sembrare la la pagina in realtà non esiste, senza che l'URL dell'indirizzo del browser sia cambiato.

+1

e che cosa c'è di sbagliato in .htaccess? – k102

+1

Questo è il lavoro per .htaccess, non per il file PHP ... o, per entrambi, se si reindirizza tutto a index.php, ma ancora, è necessario .htaccess o accedere a httpd.conf. – Griwes

+1

vuoi dire che il tuo browser mostra l'errore 404 piuttosto che una pagina 404 personalizzata? puoi reindirizzare a qualche pagina con non esiste in tempo reale. –

risposta

24

Includere la pagina di errore nella pagina corrente e inviare un codice di stato di errore 404:

<?php 
if ($nobody_should_ever_be_here) { 
    header('HTTP/1.1 404 Not Found'); //This may be put inside err.php instead 
    $_GET['e'] = 404; //Set the variable for the error code (you cannot have a 
        // querystring in an include directive). 
    include 'err.php'; 
    exit; //Do not do any more work in this script. 
} 
?> 

Nota che dovrebbe essere usato se la pagina non dovrebbe mai essere vista. Un codice di stato migliore per l'accesso non autorizzato (se la pagina deve essere vista da alcuni utenti registrati) è 403 (Non autorizzato).

+0

Sono arrivato a rendermene conto fino a tardi, ma in realtà è quello che voglio. –

4

È possibile ottenere un 404 (o qualsiasi altro codice di risposta HTTP in realtà) a livello di codice con

header('HTTP/1.0 404 Not Found'); 
die; 
+0

l'ho fatto prima .. non ha funzionato .. –

+0

@RajBD : Funzionerebbe sempre se PHP viene eseguito come un modulo Apache (in esecuzione come FastCGI).Forse non fa quello che ti aspetti *. – Jon

+1

@DilipRajBaral Funziona, ma quando muori() subito dopo l'intestazione, vedrai l'output vuoto. Quando usi l'intestazione php 404, non produrrà automaticamente i contenuti. È necessario aggiungere alcuni contenuti prima di die() per creare la pagina 404 personalizzata. L'intestazione viene utilizzata per indicare ai motori di ricerca, agli spider e ai bot che l'URL corrente non è più disponibile. –

1

Ciò che scrivi ci rende difficile da capire.

voglio reindirizzare qualsiasi utente in entrata al 404 pagina di errore se s/he raggiunge la pagina io non lo voglio/lei a raggiungere.

Quindi, una persona raggiunge una pagina esistente?

Se la persona raggiunge ad esempio una pagina protetta che lui/lei non è supposta a vedere. Usare l'intestazione è il modo migliore. Le tue opzioni sono di eco meta-refresh o javascript, ma l'intestazione è molto più pulita. È possibile visualizzare qualcosa come You do not have permission to do that! che è piuttosto comune sul web. Se non si desidera reindirizzare, è possibile visualizzare un "falso messaggio" 404 tramite l'intestazione.

Se si sta parlando di qualcuno di raggiungere una pagina 404, un file che non esiste, è unica opzione è quella di utilizzare .htaccess

+0

@ k102 Esiste già .htaccess per la gestione delle pagine di errore. Quello che voglio fare è semplicemente mostrare la pagina di errore per la pagina esistente come sarebbe stata mostrata per la pagina non esistente. –

2

Nella mia esperienza il modo migliore per mostrare il documento di errore 404 senza cambiare l'URL è quello di definire documento di errore in Apache .htaccess di file:

RewriteEngine on 
RewriteBase/

# Defines 404 error pages content: 
ErrorDocument 404 /my_root/errors/404.html 

# for all invalid links (non existing files): 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* - [L,R=404] 

# for some valid links (existing files to be un-accessible): 
RewriteCond %{THE_REQUEST} ^.*some_file.php.*$ [NC] 
RewriteRule .* - [L,R=404] 
Problemi correlati