Redirect loop con Firefox e Wordpress: cronaca di un problema
Qualche giorno fa, grazie all’upgrade di Wordpress su uno dei blog che gestisco, ho individuato un’interessante particolarita’ che puo’ nascondere effetti collaterali spiacevoli.
Per chi interessato, segue una breve cronaca.
Subito dopo l’upgrade esaminai il sito, tutto funzionava correttamente. Un paio di giorni dopo, il pannello di Webmaster tools mi segnalava una nutrita serie di “Crawl errors”, buona parte contrassegnati come Redirect error. Le URL corrispondenti a questi redirect error erano essenzialmente (ma non solo) del tipo:
http://www.miosito.it/esempio-di-titolo-post
http://www.miosito.it/esempio-di-titolo-post/
Tentando l’accesso alle URL prive di trailing slash con Internet Explorer, tutto funzionava. Riprovando la medesima cosa con Firefox, il browser visualizzava questo errore:
Redirect Loop
Firefox has detected that the server is redirecting the request for this address in a way that will never complete. The browser has stopped trying to retrieve the requested item. The site is redirecting the request in a way that will never complete.
* Have you disabled or blocked cookies required by this site?
* NOTE: If accepting the site’s cookies does not resolve the problem, it is likely a server configuration issue and not your computer.
In altre parole, Firefox rilevava un errore di loop su redirect, non diversamente da quanto fatto e segnalato da Google sul pannello di controllo.
L’aspetto curioso era che tentando l’accesso all’url con il trailing slash (http://www.miosito.it/esempio-di-titolo-post/) il problema di redirect non sussisteva, tuttavia, provando ad accedere con l’url priva dello slash finale, veniva a generarsi un loop che causava il redirect error. Per questa ragione, probabilmente, Google bollava come “errate” anche le url “sane” dotate dello slash finale.
Sul blog in esame era anche installato il plugin Redirection (in realta’, una versione modificata dal sottoscritto per risolvere alcuni problemi nativi di prestazione).
Questo plugin permette di impostare agevolmente delle regole per eseguire redirect 301 da pagine con post vecchi verso altre pagine con post piu’ recenti. La redirect e’ eseguita dal CMS anziche’ dal web server (opzione computazionalmente piu’ onerosa, ma in alcuni casi necessaria).
Per inciso, queste redirect potrebbero/dovrebbero essere implementate direttamente attraverso il file .htaccess.
Alcuni host provider (su piani shared), comunque, nel caso queste rewrite dovessero essere in numero sostanzioso (come per quel mio blog), ripuliscono periodicamente il file .htaccess.
Questa operazione puo’ creare delle temporanee (ed indesiderate) incoerenze dal punto di vista dei motori di ricerca.
La nuova versione di WP (2.8) introduceva una serie di modiche che (su quella installazione) rendevano il funzionamento del plugin Redirection problematico (alcune redirect non funzionavano producendo lo stesso errore di redirect loop) e cio’ condusse alla conclusione che il problema fosse esclusivamente del plugin.
Analogamente, non pochi casi su vari forum specialistici imputavano a questo o ad altri plugin il medesimo problema.
In realta’, parlavamo di due cose diverse (che generavano lo stesso problema). Fermo restando la necessita’ di correggere il plugin Redirection, per risolvere alcune incongruenze, ben presto emerse che il problema della redirect con le url non dotate di trailing slash permaneva ed era dovuto ad un aspetto di funzionamento del modulo mod_rewrite di Apache sotto alcune circostanze.
Piu’ precisamente, impostando delle regole di riscrittura su URL prive di trailing slash, su Apache+mod_rewrite, si potrebbe incorrere in un problema di redirection loop. Questo problema di redirezione e’ subdolo in quanto dipende dal modo con cui il client (browser o spider) interpreta/formula la redirect e dipende da come il web server gestisce queste richieste. Risultato, usando IE non ci si accorge del problema, usando Firefox o Safari il loop risulta evidente.
Con Firefox consiglio l’uso dell’addon Live HTTP headers, per esaminare le intestazione dei messaggi che client e server si scambiano. In altre circostanze, potrebbe essere utile anche il servizio online web-sniffer.net.
Per concludere, il suddetto problema si risolve modificando il file .htaccess che nelle installazioni standard di Wordpress e’ fatto cosi’:
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
La modifica consiste nello “spiegare” ad Apache che se l’url non e’ dotata di trailing slash allora deve ricostruirla, aggiungendo lo slash e generando una redirect 302 al client. In alternativa, se l’URL e’ dotata di trailing slash, allora si puo’ procedere alla redirezione su index.php (come nell’impostazione originale).
Questa “spiega” si puo’ tradurre “grossolanamente” nella seguente modifica al file .htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(/)$
RewriteRule ^(.*)$ /$1/ [R,L,NC]RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /index.php/$1 [L,NC]
Scrivo “grossolanamente” in quanto le medesime regole di riscrittura potrebbero essere implementate in modo piu’ efficace (ed efficiente!), ottenendo lo stesso risultato.
Con questa correzione si risolve il problema dei redirect loop dovuto all’impostazione di URL senza trailing slash.
Ricordate che il permanere di errori bloccanti (cosi’ come evidenziati da Webmaster tools) puo’ inficiare la velocita’ di scansione del crawler e, in talune circostanze, puo’ ridurre significativamente le quote di traffico entrante girato da Google.
Infine, come regola generale, prima di modificare in produzione qualsiasi cosa (specie se relativa alla configurazione della piattaforma CMS), eseguite sempre i necessari test preventivi sui sistemi di test e staging. Le considerazioni contenute in questo articolo sono – esclusivamente – legate all’esperienza diretta su un caso particolare di funzionamento, senza alcuna presunzione di generalita’.

Se non ci fosse stato questo post avrei dovuto fare un saaaaaacco di lavoro a mano!
Avevo il tuo stesso problema. Identico. Nato quando ho cambiato la struttura delle url utilizzando il plugin “Permalinksmigration”.
Ora sembra funzionare tutto correttamente ma… ora il sito mi sembra diventato incredibilmente lento. Può dipendere dalle righe che ho aggiunto seguendo quanto da te detto?
Grazie per l’aiuto che mi vorrai dare!
Alcuni link utili:
http://www.andreavit.com/blog/wordpress/permalink-url-personalizzate-wordpress.html
http://www.mydigitallife.info/2010/01/24/how-to-disable-wordpress-canonical-url-or-permalink-auto-redirect/