Il termine rein­di­riz­za­men­to 301 si riferisce all’inoltro per­ma­nen­te di un indirizzo web a un altro. Vi spie­ghia­mo il contesto tecnico e vi mostriamo come impostare il rein­di­riz­za­men­to 301 con il file htaccess sul server.

A cosa servono i rein­di­riz­za­men­ti 301?

Il rein­di­riz­za­men­to 301 (co­no­sciu­to anche come inoltro 301 o redirect 301, in inglese) è il tipo di rein­di­riz­za­men­to più co­no­sciu­to. Il numero 301 si riferisce al codice di stato HTTP sot­to­stan­te. Mentre il codice di stato 404 indica che la risorsa richiesta non può essere trovata, i codici 300 indicano i rein­di­riz­za­men­ti. Di norma, i rein­di­riz­za­men­ti 301 servono a prevenire gli errori 404.

Di seguito trovate un riepilogo dei più im­por­tan­ti codici di stato relativi ai rein­di­riz­za­men­ti:

Codice di stato http Spiea­zio­ne
200 OK Il server ha trovato una risorsa all’indirizzo richiesto e la re­sti­tui­sce.
301 Moved Per­ma­nen­tly La risorsa all’indirizzo richiesto è per­ma­nen­te­men­te di­spo­ni­bi­le a un nuovo indirizzo re­sti­tui­to dal server. Il vecchio indirizzo non è più valido.
203 Found La risorsa all’indirizzo in­ter­ro­ga­to è tem­po­ra­nea­men­te di­spo­ni­bi­le a un nuovo indirizzo re­sti­tui­to dal server. Il vecchio indirizzo potrebbe essere nuo­va­men­te valido in futuro.
303 See Other Simile a 302, ma solo le richieste GET sono con­sen­ti­te quando si richiama l’indirizzo tem­po­ra­neo.
307 Temporary Redirect Simile a 302; a dif­fe­ren­za di 303, il client può cambiare il metodo HTTP (GET, POST, PUT, ecc.) quando richiama l’indirizzo tem­po­ra­neo.
404 Not Found Il server non riesce a trovare una risorsa all’indirizzo richiesto.

Inoltro 301 per la mi­gra­zio­ne dei contenuti

I contenuti web, noti anche come risorse, si trovano agli indirizzi web. A volte le risorse vengono migrate, cioè il contenuto rimane lo stesso, ma l’indirizzo cambia. È il caso, ad esempio, del passaggio da HTTP a HTTPS, dello spo­sta­men­to di un sito su un nuovo dominio o dell’adat­ta­men­to della struttura dei link per l’ot­ti­miz­za­zio­ne per i motori di ricerca. In tutti i casi, è opportuno evitare che gli utenti che accedono agli indirizzi esistenti non arrivino da nessuna parte.

Se il server non può assegnare una risorsa a un indirizzo, re­sti­tui­sce l’errore HTTP 404 “Not Found”. Una si­tua­zio­ne fa­sti­dio­sa per gli utenti che non possono accedere alla risorsa de­si­de­ra­ta. Se l’indirizzo viene ri­chia­ma­to da un crawler invece che da un umano, gli errori 404 portano alla dein­di­ciz­za­zio­ne della risorsa associata. Entrambi gli scenari vanno evitati il più possibile dai gestori dei siti web.

Rein­di­riz­za­men­ti 301 per l’ot­ti­miz­za­zio­ne per i motori di ricerca

Oltre alla modifica dell’indirizzo dei contenuti web, i rein­di­riz­za­men­ti 301 sono es­sen­zia­li per l’ot­ti­miz­za­zio­ne per i motori di ricerca (SEO) e l’online marketing. Questi vengono uti­liz­za­ti per creare i co­sid­det­ti “pretty URL”, im­por­tan­ti per la SEO e i “canonical URL”. Anche i link shortener popolari per la di­stri­bu­zio­ne delle pagine di de­sti­na­zio­ne sui social media, si basano in­ter­na­men­te su rein­di­riz­za­men­ti di tipo 301.

Perché gli inoltri 301 sono così im­por­tan­ti per la SEO? A dif­fe­ren­za dei rein­di­riz­za­men­ti 302, 303 e 307, solo il rein­di­riz­za­men­to 301 tra­sfe­ri­sce il “link juice” dell’indirizzo originale al nuovo indirizzo. Se un motore di ricerca ha in­di­ciz­za­to un contenuto e lo ha valutato po­si­ti­va­men­te, l’indirizzo può essere rein­di­riz­za­to tramite 301 senza perdere la va­lu­ta­zio­ne. È così che i rein­di­riz­za­men­ti 301 rendono possibili strategie SEO complesse come la strategia mul­ti­do­mi­nio.

Come fun­zio­na­no i rein­di­riz­za­men­ti 301?

I rein­di­riz­za­men­ti 301 entrano in gioco nello scambio tra server web e client. Il server indica al client che la risorsa de­si­de­ra­ta non è più di­spo­ni­bi­le all’indirizzo web (URL) richiesto e lo tra­sfe­ri­sce all’indirizzo ora valido. Il client può essere il browser di un utente umano o un bot di un motore di ricerca.

  1. Il client tenta di accedere alla risorsa dell’URL.
  2. Il server risponde con il codice di stato 301 “Moved Per­ma­nen­tly” e passa il nuovo URL per l’accesso alla risorsa HTTP location header.
  3. Il client memorizza il nuovo URL nella cache; gli accessi futuri al vecchio URL passano im­me­dia­ta­men­te al nuovo URL.
  4. Il client tenta di re­cu­pe­ra­re la risorsa con il nuovo URL.

Il processo può essere il­lu­stra­to con il popolare strumento di rete cURL Ri­chia­mia­mo la pagina web di IONOS all’indirizzo http://ionos.it e usiamo l’opzione –head per vi­sua­liz­za­re l’HTTP response header:

curl --head http://ionos.it

Il server IONOS risponde con il codice di stato HTTP “301 Moved Per­ma­nen­tly”, il location header contiene il nuovo indirizzo https://www.ionos.it/. Come potete vedere, il sito web si trova sul sot­to­do­mi­nio WWW e utilizza il pro­to­col­lo HTTPS. Suc­ces­si­va­men­te, istruiamo ul­te­rior­men­te cURL a seguire il rein­di­riz­za­men­to 301 con l’opzione –location:

curl --head --location http://ionos.it

Ora cURL produce gli header di due con­nes­sio­ni. Con la seconda chiamata, il server risponde con il codice di stato “200 OK”; la risorsa è stata trovata, il contenuto viene trasmesso nel corpo della risposta. Lo stesso processo viene eseguito in back­ground nel browser quando si inserisce l’indirizzo.

Definire il rein­di­riz­za­men­to 301 tramite il file htaccess

Abbiamo visto quale ruolo svolgono gli inoltri 301 nello scambio tra server e client. Ma come si possono impostare i rein­di­riz­za­men­ti 301 sul server? Esistono vari approcci; uno dei più uti­liz­za­ti è quello di definire le direttive di rein­di­riz­za­men­to nel file htaccess del server web Apache. Affinché questo funzioni, i moduli Apache cor­ri­spon­den­ti devono essere attivi:

Direttive Modulo Apache Spie­ga­zio­ne
Redirect mod_alias Rein­di­riz­za­men­to semplice
Rewrite mod_rewrite Rein­di­riz­za­men­to complesso

Rein­di­riz­za­men­ti semplici per l’inoltro 301 nel file htaccess

Vediamo in­nan­zi­tut­to come si possono definire semplici rein­di­riz­za­men­ti di tipo 301 nel file htaccess. A tale scopo uti­liz­zia­mo le direttive di rein­di­riz­za­men­to del modulo mod_alias. Queste sono adatte per inoltrare un URL sul server a un altro URL. Lo schema è ab­ba­stan­za semplice:

Redirect 301 "/source_path" "target_URL"

Per prima cosa rein­di­riz­zia­mo un URL del server a un altro URL interno. La barra all’inizio indica l’inizio del percorso dell’URL, cioè la parte dopo il dominio:

Redirect 301 "/old.html" "/new.html"

Se invece vogliamo fare ri­fe­ri­men­to a un URL esterno, lo in­di­chia­mo come de­sti­na­zio­ne:

Redirect 301 "/old.html" "http://example.com/new.html"

È anche possibile definire rein­di­riz­za­men­ti 301 di intere directory nel file htaccess uti­liz­zan­do la direttiva redirect. Rein­di­riz­zia­mo tutti gli URL che iniziano con il com­po­nen­te di percorso “it” a un sot­to­do­mi­nio:

Redirect 301 "/it/" "http://it.example.com/"

Lo stesso schema può essere usato per inoltrare tutti gli URL di un dominio:

Redirect 301 "/" "http://other.example.com/"

Se de­si­de­ra­te rein­di­riz­za­re molti indirizzi in­di­vi­dua­li che seguono un certo schema, annotare i singoli rein­di­riz­za­men­ti diventa com­pli­ca­to ab­ba­stan­za in fretta. In questo caso, potete usare la direttiva Re­di­rect­Match, che utilizza un’espres­sio­ne regolare per ri­co­no­sce­re gli schemi ed estrarre parti di essi:

RedirectMatch 301 regex URL

Vi mostriamo qui un esempio di voce Re­di­rect­Match che estrae la categoria e l’ID di un articolo dai parametri GET e li riscrive nel percorso:

RedirectMatch 301 "/article.php?cat=(.*)&id=(.*)" "/articles/$1/$2/"

Im­ma­gi­nia­mo che il dominio sia example.com. Allora l’URL sarebbe http://example.com/article.php?cat=web&id=42 rein­di­riz­za­to a http://example.com/articles//web/42/.

Rein­di­riz­za­men­ti complessi per il rein­di­riz­za­men­to 301 nel file htaccess

Per creare rein­di­riz­za­men­ti 301 per casi d’uso complessi, si possono usare le direttive di rewrite del modulo di rein­di­riz­za­men­to di Apache mod_rewrite. Questo può essere usato per definire e in­ter­ro­ga­re le con­di­zio­ni di inoltro, impostare e leggere variabili d’ambiente e definire regole di inoltro con espres­sio­ni regolari.

Con mod_rewrite è possibile con­ca­te­na­re le regole di rein­di­riz­za­men­to; il modulo fornisce una sorta di mini-lin­guag­gio di pro­gram­ma­zio­ne per tra­sfor­ma­re gli URL e attivare i rein­di­riz­za­men­ti. Si rac­co­man­da cautela, perché un uso scorretto può causare cicli infiniti.

Le direttive di ri­scrit­tu­ra iniziano con la riga “Rew­ri­teEn­gi­ne on”. Seguono con­di­zio­ni di rein­di­riz­za­men­to opzionali Rew­ri­te­Cond, concluse da una o più regole di rein­di­riz­za­men­to Rew­ri­te­Ru­le. Il com­por­ta­men­to delle con­di­zio­ni e delle regole di rein­di­riz­za­men­to può essere in­fluen­za­to da opzioni chiamate “flag”. Per attivare un rein­di­riz­za­men­to 301, una delle regole deve contenere i flag L,R=301:

RewriteEngine on
RewriteCond TestString CondPattern [flags]
RewriteRule URL_path Substitution [L,R=301]

All’interno delle regole e delle con­di­zio­ni di inoltro è possibile accedere a numerose variabili di in­te­sta­zio­ne e di server nella forma %{HTTP_HOST}, %{REQUEST_URI}, ecc. Queste possono essere collegate da operatori ed elaborate con funzioni. In questo modo, è possibile rea­liz­za­re quasi tutti i rein­di­riz­za­men­ti de­si­de­ra­ti, anche se la sintassi non è esat­ta­men­te intuitiva.

Vediamo un esempio di rein­di­riz­za­men­to 301 uti­liz­zan­do mod_rewrite. Vogliamo uti­liz­za­re URL canonici per evitare contenuti duplicati sul nostro sito web. Ciò significa che tutti gli URL devono iniziare con HTTPS e WWW, in­di­pen­den­te­men­te dal modo in cui i vi­si­ta­to­ri e le vi­si­ta­tri­ci accedono ai contenuti.

Definiamo due con­di­zio­ni di inoltro, che col­le­ghia­mo con il flag OR. La prima con­di­zio­ne verifica se HTTPS è di­sat­ti­va­to, la seconda controlla se il dominio è privo dell’iniziale WWW. Tramite il flag NC, di­sat­ti­via­mo la di­stin­zio­ne tra maiuscole e minuscole. Se una delle due con­di­zio­ni è vera, rein­di­riz­zia­mo alla versione HTTPS-WWW dell’URL tramite un rein­di­riz­za­men­to 301. Uti­liz­zia­mo l’espres­sio­ne regolare (. *), che raccoglie qualsiasi URL, e la inseriamo dopo il dominio uti­liz­zan­do $1:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]

Quali sono i problemi e i pericoli dell’utilizzo dei rein­di­riz­za­men­ti 301?

I rein­di­riz­za­men­ti 301 sono uno strumento standard nello sviluppo web e nella SEO. Tuttavia, è ne­ces­sa­rio prestare at­ten­zio­ne quando li si imposta; se vengono uti­liz­za­ti in modo improprio, si rischiano seri problemi. Il server potrebbe bloccarsi o il sito potrebbe perdere la posizione con­qui­sta­ta sui motori di ricerca.

Dan­neg­gia­men­to del file htaccess durante la modifica manuale

Il file htaccess configura il server web Apache a livello di directory. Anche la più piccola modifica errata a questo file può fa­cil­men­te portare a un sito web inac­ces­si­bi­le. In questo caso si verifica il fa­mi­ge­ra­to errore 500 o la schermata bianca, “White Screen of Death”, su WordPress.

È meglio fare una copia del file htaccess prima di mo­di­fi­car­lo. Potete farlo fa­cil­men­te dalla riga di comando. Passiamo alla directory web pubblica del sito e usiamo il comando cp:

cp -a .htaccess _htaccess

Se si ve­ri­fi­ca­no errori dopo la modifica del file htaccess, ri­pri­sti­nia­mo la versione originale:

cp -a _htaccess .htaccess

Rein­di­riz­za­men­ti con­ca­te­na­ti e cicli di rein­di­riz­za­men­to

I rein­di­riz­za­men­ti sono utili, ma “costano” un ciclo completo di richiesta-risposta. Se si uti­liz­za­no rein­di­riz­za­men­ti con­ca­te­na­ti, gli utenti devono aspettare, il che comporta un aumento della frequenza di rimbalzo. I motori di ricerca valutano ne­ga­ti­va­men­te anche le pagine che rein­di­riz­za­no più volte di seguito. Come regola generale, si possono cambiare al massimo tre rein­di­riz­za­men­ti in suc­ces­sio­ne.

I cicli di rein­di­riz­za­men­to, in cui due indirizzi vengono inoltrati all’infinito l’uno verso l’altro, sono fatali. Per gli utenti, ciò crea l’errore ERR_TOO_MANY_REDIRECTS. La risorsa de­si­de­ra­ta non può quindi essere raggiunta. In generale, si do­vreb­be­ro testare i rein­di­riz­za­men­ti appena impostati con cURL per as­si­cu­rar­si che si raggiunga il risultato de­si­de­ra­to.

Av­ve­le­na­men­to ac­ci­den­ta­le della cache quando si usa l’inoltro 301

Un uso scorretto del rein­di­riz­za­men­to 301 può causare problemi in seguito. A dif­fe­ren­za dei rein­di­riz­za­men­ti tem­po­ra­nei di tipo 302, 303 e 307, il rein­di­riz­za­men­to 301 indica al client di me­mo­riz­za­re nella cache il nuovo URL. Se si desidera tornare all’URL originale in un secondo momento, questa richiesta non viene ricevuta dai client, che invece con­ti­nua­no a con­net­ter­si con il nuovo URL. Per ovviare a questo problema, si possono uti­liz­za­re rein­di­riz­za­men­ti tem­po­ra­nei o impostare l’in­te­sta­zio­ne di cache control su un valore adeguato.

Quando si definisce la regola redirect 301 nel file htaccess, si imposta l’in­te­sta­zio­ne di cache control a un’ora. Questo assicura che le suc­ces­si­ve modifiche alla de­sti­na­zio­ne del rein­di­riz­za­men­to arrivino a tutti i client:

ExpiresActive on
ExpiresDefault "access plus 1 hour"
Redirect 301 / https://www.example.com/

Se uti­liz­za­te rein­di­riz­za­men­ti complessi con direttive di ri­scrit­tu­ra, potete ricorrere a un trucco per impostare l’in­te­sta­zio­ne di cache control. Definite una variabile d’ambiente li­mit­ca­che come parte della regola di inoltro 301. Quindi impostate l’in­te­sta­zio­ne, leggendo la variabile d’ambiente come con­di­zio­ne. Questo assicura che l’in­te­sta­zio­ne corretta sia impostata durante l’inoltro:

RewriteRule ^.* http://www.example.com/ [L,R=301,E=limitcache:1]
Header always set Cache-Control "max-age=3600" env=limitcache
Consiglio

Avete seguito un rein­di­riz­za­men­to 301 e ora il browser si rifiuta di accedere all’indirizzo originale? Basta ag­giun­ge­re al vecchio indirizzo una “query string” con qualsiasi contenuto nella forma ?foo=bar e co­strin­ge­re il browser a caricare l’URL.

Vai al menu prin­ci­pa­le