Creare una pagina di errore 404 personalizzata per Joomla: il modo giusto

pagina errore 404L'importanza di gestire l'errore 404 è molto dibattuto in rete, e sicuramente tutti concordano che all'utente debba essere offerta una visione confortevole della situazione che non lo faccia desistere dal continuare a visitare il nostro sito. Sicuramente la pagina di errore di default di Joomla non aiuta in questo, pertanto, se il vostro template non prevede una pagina di errore personalizzata, prendete in considerazione di costruirne una.

Questo articolo richiede delle conoscenze di base di html, php e del protocollo http. Gli interventi richiesti sul codice potrebbero non essere alla portata dei lettori meno esperti, ma la lettura di questo articolo aiuterà soprattutto questi ultimi a capire quante inesattezze vi sono in rete.

 

http status code 404: a che serve?

La prima cosa da capire, ed è fondamentale per comprendere la posizione sostenuta in questo articolo, è che cosa rappresenti l'errore in questione.

Quando, ad esempio tramite un browser, si effettua una richiesta ad un server, la prima informazione restituita dal server stesso è lo status code http, i codici maggiori di 400 indicano il verificarsi di un errore.

Noi ci limiteremo al codice di stato 404, il cosiddetto not found (non trovato).

A parte l'indicarci che abbiamo sbagliato a inserire un collegamento o a scrivere un link, questo errore è fondamentale nel momento in cui effettuiamo delle modifiche alla struttura del nostro sito, poiché esso indica ai motori di ricerca che la risorsa (tipicamente la pagina) non è più disponibile e non deve essere più mantenuta nel loro indice. Se l'errore si protrae nel tempo i motori rimuovono la voce non più esistente. Piccola nota: la rimozione dai motori non è immediata dato che qli stessi prevedono anche il caso che si tratti di un errore temporaneo.

In realtà quando si modifica la struttura di un sito, lo status code da restituire per le risorse rimosse sarebbe 410 (gone, andato) e non 404, ma al momento in cui scriviamo i principali motori di ricerca trattano il codice 410 alla stregua di un 404.

 

Creare la pagina di errore 404 

pagina errore 404La creazione della pagina di errore è lasciata alla fantasia del lettore. Accedete alla sezione contenuti -> articoli e create un nuovo articolo con il titolo "404 Error Page". All'interno di tale articolo impostate il messaggio che preferite e con lo stile che preferite. Non ci dilungheremo su come realizzare questo testo, ma tenete presente che state comunicando una situazione di errore, quindi fatelo nel modo più rassicurante possibile per l'utente; molti usano pagine 404 dal contenuto divertente o spiritoso, vi è un buon motivo: quello di non perdere l'utente.

 

Pagina di errore 404 personalizzata: il modo sbagliato

Vi sono diverse guide in rete e quasi tutte derivano dalla guida http://docs.joomla.org/index.php?title=Creating_a_Custom_404_Error_Page presente nella documentazione di Joomla, il solo problema è che questa guida è profondamente sbagliata. La cosa è stata da me segnalata, almeno all'interno della comunità Joomla italiana, ma la mia asserzione è stata accolta con un imbarazzato silenzio: dal canto mio non penso che la documentazione di Joomla sia un testo sacro che debba essere accettato così come è.

Vediamo nel dettaglio perché le indicazioni riportate nel citato documento sono sbagliate.

L'errore principale sta nel modo usato per passare dalla pagina di errore di Joomla alla pagina che contiene l'articolo destinato alla gestione dello stesso:

if (($this->error->getCode()) == '404') { 
  header('Location: /index.php?option=com_content&view=article&id=[id_articolo_404]'); 
  exit; 
}
 

L'inserimento nell'header http (attenzione non head html) della pagina di segnalazione dell'errore della direttiva 'Location' fa sì che lo status code 404 Not found sia sovrascritto dallo status code 302 Found (trovato) e pertanto l'errore non è più riportato al motore di ricerca che:

  1. continuerà ad indicizzare una risorsa inesistente che molto probabilmente abbiamo rimosso intenzionalmente
  2. troverà molti indirizzi che vengono rinviati ad una medesima pagina poco coerente con il contenuto cercato e con rischio di penalizzazione
  3. non permetterà l'indicizzazione della pagina sostitutiva (o la penalizzerà) ritenendola duplicato di quanto già nell'indice

 

Pagina di errore 404 personalizzata: il modo giusto

Qual è il modo giusto? Per prima cosa, se il nostro template non ha il file error.php per la gestione degli errori, non limitiamoci a crearne uno che gestisca il solo errore 404 (non è un bell'approccio), ma copiamo nella root del nostro template il file error.php che si trova nella root del template "system".

Apriamo ora la pagina error.php con un editor di testo o php ed inseriamo questo codice prima della apertura del codice hmtl, ma sempre all'interno del codice php (ovvero prima di ?>):

// l'articolo lo facciamo recuperare al codice!
$link404='';
if ($this->error->getCode() == '404') {
  $db = JFactory::getDBO();
  $db->setQuery("SELECT COALESCE(id, 0) FROM #__content WHERE state = 1 and title = '404 Error Page'");
  if($article = $db->loadResult()){
    $link404=$this->baseurl . '/index.php?option=com_content&view=article&id='.$article;
  }
}
 

Questo codice ci permetterà di non doverci preoccupare dell'id dell'articolo, sarà sufficiente che l'articolo abbia come titolo "404 Error Page"; se preferite un'altro titolo basta modificarlo nella query (occhio agli apostrofi! è sql).

Un  consiglio: non usate la classe JRoute per calcolare l'indirizzo SEF dell'articolo: se siete in una situazione di errore 404 potrebbe anche essere che il problema sia nel routing sef.

Ora nella sezione <head> del codice html inserite il seguente codice:

<?php if($link404): ?>  
<meta http-equiv="refresh" content="1; url=<?php echo $link404; ?>">
<?php endif; ?>
 

Perché il timeout per il refresh è 1 e non 0? Sebbene lo standard W3C preveda espressamente che il valore zero sia valido, in passato alcuni browser non amavano tale valore, probabilmente per l'abuso che se ne è fatto; uno è pertanto un valore conservativo, se preferite mettete pure zero.

Eventualmente è possibile, ma a mio avviso non necessario, inserire il reindirizzamento anche tramite javascript. Tenete presente che è possibile che qualche utente abbia javascript disabilitato, ma sono veramente pochissimi coloro che disabilitano la redirezione tramite meta; comunque, per completezza, il codice precedente assumerebbe questo aspetto:

<?php if($link404): ?>  
<meta http-equiv="refresh" content="1; url=<?php echo $link404; ?>">
<script type="text/javascript">window.location = "<?php echo $link404; ?>"; </script>  
<?php endif; ?>
 

Ed ecco fatto.

A questo punto il webserver restituirà al client, sia esso il browser od un motore di ricerca, il corretto codice di status, mentre il meta refresh avrà effetto sulla pagina solo se caricata da un browser.

 

404 nella pagina personalizzata

Alcune guide, poche in verità,  suggeriscono di inserire l'header di errore alla visualizzazione della pagina che abbiamo personalizzato, tramite l'istruzione PHP header(); a parte il fatto che nessuna spiega come sia possibile fare ciò, ovvero inserire il codice php nell'articolo, anche questo consiglio è assolutamente sbagliato.

Infatti la segnalazione di errore si riferirebbe alla pagina corrente, ovvero a quella di destinazione della redirezione, e non alla pagina non più esistente, la cui esistenza è invece stata appena confermata al motore di ricerca proprio dalla redirezione, che è bene ricordarlo, viene effettuata con l'header HTTP 302 Found (ovviamente se non avete seguito il metodo qui descritto).


 

Che cosa insegna questa esperienza? che un poco di prudenza quando si ascolta un consiglio ci vuole sempre, da qualsiasi parte arrivi detto consiglio!

happy coding,

marco maria leoni

 

Commenti   

0 #2 Giuseppe 2015-11-14 15:04
Ciao Marco, grazie per la guida.
E' normale che se viene richiamata una pagina non esistente prima venga visualizzata la pagina 404 del server?
Non mi è chiaro poi come fare una pagina di errore multilingua. Io uso joomla 3.4.5, mi potresti spiegare meglio ?
Grazie ciao.
Giuseppe

P.S. nella pagina di errore che ho creato mi viene messo in cima la scritta "Articoli", come puoi vedere se provi, ma non riesco a toglierla!!! ho fatto quello che ho sempre fatto ma continuo ad averla... dove devo agire??? grazie.

=== Risposta
ciao Giuseppe
1) dipende dalla configurazione del server, ma è più facile che sia una configurazione del template e del sottostante framework
2) se avrò tempo aggiungerò un articolo, la cosa non è difficile ma un pelo lunga
3) bisognerebbe vedere il codice, ma risolvi prima il punto 1)
Citazione
0 #1 Andrea 2015-07-11 12:26
Salve, intanto ringrazio per la guida.
L'ho applicata ad un sito multilingua (Italiano-Ingle se) fatto con Joomla 2.5.

Come posso fare ad avere lo stesso risultato con il reindirizzament o all'articolo tradotto in Inglese?

Grazie

===Risposta
ciao Andrea,
usa 'JFactory::getL anguage()->getT ag()' per ottenere il codice della lingua corrente, poi lo inserisci nella query sui contenuti per filtrare il campo 'language' (nel where). a questo punto devi avere una pagina per ogni lingua.

niente di complicato, ma la cosa più semplice è realizzare una pagina di errore multilingua, magari utilizzando il tag 'lang' per individuare le due lingue nell'html.

ciao
marco
Citazione

Aggiungi commento

Please note: URL in text are not linked and user's site address is only for internal use and is not published.

Comments are human checked. All spam will be removed, so don't waste your time and, especially, mine!

Codice di sicurezza
Aggiorna

L'estate si avvicina hai già trovato l'albergo per le vacanze? cerca un albergo al mare o un hotel in montagna ove trascorrere le tue vacanze.