Premessa
Ho trascorso una buona parte degli ultimi tre mesi nel tentativo di risolvere il problema proposto anche in questo forum. Mi sembra utile condividere la soluzione più semplice finora individuata. Essa si applica a Joomla! 4.2, in particolare alle versioni dalla 4.2.6 in poi. Non ho esperienza sulle versioni precedenti, in quanto ho migrato il mio sito da Joomla 2.5.28 alla versione indicata, senza migrazioni intermedie.
Causa
Come intuivo già nel primo post, la causa degli errori sta nel componente tags. Presumo che tutto dipenda dal file router.php, presente nel percorso /components/com_tags/src/Service. In ultima istanza, è possibile un errore a monte nelle API di Joomla!.
Soluzione
Ho tentato diverse soluzioni: all’inizio ho reindirizzato ogni singolo errore 404, ma ho dovuto desistere sia per l’alto numero di errori registrati ogni giorno, sia perché da metà febbraio sono comparsi nuovi errori mai registrati prima a seguito dell’aggiornamento a Joomla! 4.2.8.
Per tagliare la testa al toro, ho lavorato in parallelo su htaccess. Inizialmente ho preferito generare una riga di redirect per ogni tag, per evitare problemi di SEF e di SEO. Nel frattempo ho provato a generare una sola riga per risolvere tutti i problemi:
RewriteRule ^component/tags/(.*).html /component/tags/tag/$1.html [R=301,L]
Questa riga genera un loop con errore ERR_TOO_MANY_REDIRECTS, senza alcuna soluzione.
Sono giunto, finalmente, a una soluzione stabile e complessivamente economica riducendo a una riga di redirect per ogni lettera dell’alfabeto (si veda nel codice dopo il commento ## 1). La lettera “t”, soggetta a loop, ha richiesto accorgimenti specifici: una singola riga per ogni parola che inizia con “ta” (si veda nel codice dopo il commento ## 3); alcune righe per i casi in cui la lettera “t” è seguita da vocale o consonante (si veda nel codice dopo il commento ## 2). Ecco il codice:
## 1/ Per lettera e cifra (“t” esclusa)
RewriteRule ^component/tags/a(.*).html /component/tags/tag/a$1.html [R=301,L]
RewriteRule ^component/tags/b(.*).html /component/tags/tag/b$1.html [R=301,L]
RewriteRule ^component/tags/c(.*).html /component/tags/tag/c$1.html [R=301,L]
RewriteRule ^component/tags/d(.*).html /component/tags/tag/d$1.html [R=301,L]
RewriteRule ^component/tags/e(.*).html /component/tags/tag/e$1.html [R=301,L]
RewriteRule ^component/tags/f(.*).html /component/tags/tag/f$1.html [R=301,L]
RewriteRule ^component/tags/g(.*).html /component/tags/tag/g$1.html [R=301,L]
RewriteRule ^component/tags/h(.*).html /component/tags/tag/h$1.html [R=301,L]
RewriteRule ^component/tags/i(.*).html /component/tags/tag/i$1.html [R=301,L]
RewriteRule ^component/tags/j(.*).html /component/tags/tag/j$1.html [R=301,L]
RewriteRule ^component/tags/k(.*).html /component/tags/tag/k$1.html [R=301,L]
RewriteRule ^component/tags/l(.*).html /component/tags/tag/l$1.html [R=301,L]
RewriteRule ^component/tags/m(.*).html /component/tags/tag/m$1.html [R=301,L]
RewriteRule ^component/tags/n(.*).html /component/tags/tag/n$1.html [R=301,L]
RewriteRule ^component/tags/o(.*).html /component/tags/tag/o$1.html [R=301,L]
RewriteRule ^component/tags/p(.*).html /component/tags/tag/p$1.html [R=301,L]
RewriteRule ^component/tags/q(.*).html /component/tags/tag/q$1.html [R=301,L]
RewriteRule ^component/tags/r(.*).html /component/tags/tag/r$1.html [R=301,L]
RewriteRule ^component/tags/s(.*).html /component/tags/tag/s$1.html [R=301,L]
RewriteRule ^component/tags/u(.*).html /component/tags/tag/u$1.html [R=301,L]
RewriteRule ^component/tags/v(.*).html /component/tags/tag/v$1.html [R=301,L]
RewriteRule ^component/tags/w(.*).html /component/tags/tag/w$1.html [R=301,L]
RewriteRule ^component/tags/x(.*).html /component/tags/tag/x$1.html [R=301,L]
RewriteRule ^component/tags/y(.*).html /component/tags/tag/y$1.html [R=301,L]
RewriteRule ^component/tags/z(.*).html /component/tags/tag/z$1.html [R=301,L]
RewriteRule ^component/tags/([0-9])(.*).html /component/tags/tag/$1$2.html [R=301,L]
## 2/ Lettera t con iniziale diversa da ta-
RewriteRule ^component/tags/te(.*).html /component/tags/tag/te$1.html [R=301,L]
RewriteRule ^component/tags/th(.*).html /component/tags/tag/th$1.html [R=301,L]
RewriteRule ^component/tags/ti(.*).html /component/tags/tag/ti$1.html [R=301,L]
RewriteRule ^component/tags/to(.*).html /component/tags/tag/to$1.html [R=301,L]
RewriteRule ^component/tags/tr(.*).html /component/tags/tag/tr$1.html [R=301,L]
RewriteRule ^component/tags/tu(.*).html /component/tags/tag/tu$1.html [R=301,L]
## AGGIUNGERE ALTRE VARIABILI SE NECESSARIE
## 3/ Lettera t con iniziale ta-
RewriteRule ^component/tags/tabella.html /component/tags/tag/tabella.html [R=301,L]
## AGGIUNGERE OGNI SINGOLO TAG INIZIANTE CON TA-, COME NELL'ESEMPIO PRECEDENTE
Questa soluzione ha il pregio di risolvere definitivamente tutti gli errori 404 di ogni singolo tag, in quanto raccoglie gli indirizzi con e senza query string, con e senza paginazione. Vengono correttamente reindirizzate tutte le seguenti query:
?itemid=101, così oppure seguita da &start=([0-9]+)
?Itemid=101, così oppure seguita da &start=([0-9]+)
?/itemid=101, così oppure seguita da &start=([0-9]+)
Con il prossimo aggiornamento a Joomla! 4.3 sono stati annunciati cambiamenti nel componente tag. Spero che siano intervenuti anche sul router. Vi terrò aggiornati!
Aggiungo “RISOLTO temporaneamente” per i motivi indicati.
EDIT: Per rendere meglio l'idea, le poche righe di codice in htaccess sostituiscono migliaia di redirect generati nel mio sito, in quanto faccio uso massivo dei tag (più di 400).