Usando l'intestazione () su Htaccess per 404 non trovati
-
28-10-2019 - |
Domanda
Alcune delle pagine Web sono effettivamente contenute nel mio database. Ho l'Htaccess con quanto segue
ErrorDocument 404 /error404.php
Il mio errore404 fai a require("checkdb.php");
Quale controllo se il nome file è rappresentato in MySQL DB. In tal caso, voglio restituire 200 ok e sputare il contenuto. In caso contrario, voglio sputare quel 404
Il mio problema è che sono bloccato con 404. Sebbene la mia pagina sia correttamente visualizzata, non verrà raccolta dal motore di ricerca e Google+ non funziona, fa un controllo per la pagina e ottiene 404.
ho aggiunto
header('HTTP/1.1 200 OK');
subito dopo un controllo nel database (nessun codice HTML è stato ancora visualizzato), ma ottengo il
Avvertimento. Impossibile modificare le informazioni sull'intestazione - Intestazioni già inviate da ....
Anche se lo muovo header()
Proprio all'inizio di /error404.php
Ricevo ancora quell'errore. Sembra che Apache restituirà prima quel 404 e poi chiama /error404.php
Cosa posso fare per risolvere correttamente questo? Grazie mille in anticipo!
Soluzione
Quando Apache invia il documento specificato da ErrorDocument
, non lo sta servendo come una pagina normale e ha già inviato le intestazioni 404. Invece di usare il ErrorDocument
Direttiva In Apache, dovresti invece utilizzare il tuo script PHP per verificare prima se il documento esiste e, in caso contrario, visualizzarlo. Se non esiste, PHP invia l'intestazione di errore 404 stessa.
Di seguito non si svolgono in errore404.php, ma piuttosto in uno script normale come index.php:
// Do whatever you're doing to check
require("checkdb.php");
// If the check fails, PHP sends the 404:
header("HTTP/1.0 404 Not Found");
// Then display your custom error document with PHP
// You can display the other contents of error404.php
echo "Oops, page wasn't found!";
exit();
E rimuovere il ErrorDocument
Direttiva dalla configurazione Apache.
Altri suggerimenti
La linea di intestazione deve essere prima qualunque produzione. Senza un po 'di codice, non è possibile sottolineare da dove proviene l'output.