§ 11. Il reindirizzamento con .htaccess e web.config

Se il vostro sito rimane attivo per molti anni, cresce qualitativamente e si riempie con dei nuovi contenuti, a un certo punto sentirete la necessità di modificare la sua struttura. Modificarla per renderla meglio organizzata e più logica. Di conseguenza, molte (o addirittura tutte) le pagine del sito cambieranno il nome e/o collocazione (da una sezione all’altra). Forse vorrete anche trasferire il sito a un altro dominio.
Ma sicuramente non vorrete perdere i visitatori abituali, quelli che conoscono già gli indirizzi vecchi del sito, delle sezioni e delle pagine. Per evitare che sugli schermi di quei visitatori compaia la scritta «pagina non trovata» (errore 404), dobbiamo fare in modo che il browser dell’utente venga reindirizzato automaticamente al nuovo indirizzo di ciò che sta cercando di visualizzare.
Il reindirizzamento può essere fatto in due modi:
a. con il file di configurazione del server;
b. con uno script da inserire nel codice delle pagine che si trovano all’indirizzo vecchio.
È inutile chiedermi qual è il modo migliore: ognuno dei due può essere il più adatto alle concrete caratteristiche tecniche del vostro sito. Quindi io mi limito a descriverli. La scelta sulla applicazione, invece, spetta a voi.
Cominciamo con i file di configurazione del server: può essere il file .htaccess (nel caso di un server Apache) o il file web.config (nel caso di un server IIS).
1. Il redirect (reindirizzamento) con il .htaccess
Prima di tutto controlliamo se nella root esiste già questo file: nel caso positivo – e il più probabile – lavoriamo su quello, altrimenti lo creiamo da zero. E ora passiamo agli esempi concreti.
1.1. Per il reindirizzamento verso un nuovo dominio (per esempio, se il vostro sito si è trasferito) dovete inserire nel file .htaccess del server del vecchio dominio il seguente codice (ovviamente cambiando i domini):

RewriteEngine On
RewriteCond %{HTTP_HOST} vecchio.it
RewriteRule (.*) http://nuovo.it/$1 [R=301,L]

1.2. Per il reindirizzamento da una pagina del sito all’altra (può essere utile, per esempio, se l’indirizzo di una pagina è stato modificato) nel file .htaccess del vostro sito va inserito questo codice:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.dominio\.it$ [NC]
RewriteRule ^categoria/nomepagina/$ http://www.dominio.it/nuovapagina/ [R=301,L]

1.3. Per il reindirizzamento da una pagina qualsiasi del sito verso la pagina iniziale serve questo codice:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.dominio\.it$ [NC]
RewriteRule ^categoria/nomepagina/$ http://www.dominio.it/ [R=301,L]

1.4. Mentre nel caso contrario, cioè per il reindirizzamento dalla pagina iniziale a un’altra pagina del sito, serve questo codice:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.dominio\.it$ [NC]
RewriteRule ^$ http://www.dominio.it/categoria/nomepagina/ [R=301,L]

1.5. Per il reindirizzamento da tutte le pagine in generale verso quella iniziale va inserito questo codice:

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule !(^$|.*\.(css|jpg|gif)) / [R=301,L]

1.6. Per il reindirizzamento dai domini vecchio.it e www.vecchio.it al nuovo dominio nuovo.it inserite, invece, questo codice:

RewriteCond %{HTTP_HOST} ^vecchio\.it
RewriteRule ^(.*)$ http://nuovo.it/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www.vecchio\.it
RewriteRule ^(.*)$ http://nuovo.iy/$1 [R=301,L]

(l’utilizzo di questo codice è pero possibile e sensato solo per alcuni piani tariffari di hosting)
1.7. Qualora sul vostro server fosse attivo il modulo mode_rewrite, potreste avere la necessità di realizzare il reindirizzamento dal dominio con il www al dominio senza il www. In tale caso inserite il seguente codice:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

1.8. Se, invece, dovete fare l’opposto, quindi reindirizzare da un dominio senza il www allo stesso domino con il www, inserite questo codice:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www.) [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

1.9. Qualora avreste la necessità di reindirizzare tutti gli indirizzi delle vostre pagine al protocollo HTTPS (perché lo avete appena attivato oppure perché i vostri visitatori non sanno che lo state utilizzando sul sito), inserite questo codice:

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

1.10. Inoltre, dobbiamo ricordarci che per i motori di ricerca gli URL http://www.dominio.it/ e http://www.dominio.it sono diversi. Di conseguenza, bisogna decidere quale URL utilizzare: quello con il slash finale o quello senza. Per togliere il slash finale dagli indirizzi di tutte le pagine del vostro sito, inserite il seguente codice:

RewriteEngine On
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

1.11. Invece per aggiungerlo sempre, utilizzate questo codice:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]

1.12. A volte potrebbe anche essere utile sostituire a tutti i file l’estensione .htm con l’estensione .html – in tal caso inserite il seguente codice:

RewriteEngine on
RewriteBase /
RewriteRule ^(.*)\.htm$  $1.html [R=permanent]

Infine precisiamo una cosa importante: se nel vostro file .htaccess viene utilizzata più di una regola (per esempio, più regole prese da questo paragrafo), la riga «Rewrite Engine on» va utilizzata comunque solo una volta.

2. Il redirect (reindirizzamento) con il web.config
La logica della costruzione delle regole in un file web.config è altrettanto semplice. Quindi vediamo solo gli esempi principali.
Prima di tutto controlliamo se nella root esiste già questo file: nel caso positivo – e il più probabile – lavoriamo su quello, altrimenti lo creiamo da zero. E ora passiamo agli esempi concreti.
2.1. Per il reindirizzamento verso un nuovo dominio (per esempio, se il vostro sito si è trasferito) dovete inserire nel file web.config del server del vecchio dominio il seguente codice (ovviamente cambiando i domini):

<rule name="301 Redirect 1" stopProcessing="true">
<match url=".*" />
<action type="Redirect" url="http://nuovodominio.it" redirectType="Permanent" />
</rule>

2.2. Per il reindirizzamento da una pagina del sito all’altra (può essere utile, per esempio, se l’indirizzo di una pagina è stato modificato) nel file web.config del vostro sito va inserito questo codice:

<configuration>
  <location path="pagina1.html">
    <system.webServer>
      <httpRedirect enabled="true" destination="http://nomesito.it/pagina2.html" httpResponseStatus="Permanent" />
    </system.webServer>
  </location>
</configuration>

2.3. Per il reindirizzamento da una pagina qualsiasi del sito verso la pagina iniziale serve questo codice:

<rule name="redirect to home">
<match url="^nomepagina\.php" ignoreCase="false" />
<conditions>
<add input="{QUERY_STRING}" pattern="^$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="http://www.dominio.it/" />
</rule>

2.7. Potreste avere la necessità di realizzare il reindirizzamento dal dominio con il www allo stesso dominio senza il www. In tale caso inserite il seguente codice:

<rule name="remove www" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^www\.(.+)$" />
</conditions>
<action type="Redirect" url="http://{C:1}/{R:1}" redirectType="Permanent" />
</rule>

2.8. Se, invece, dovete fare l’opposto, quindi reindirizzare da un dominio senza il www allo stesso domino con il www, inserite questo codice:

<rule name="redirect to www" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^dominio.it$" />
</conditions>
<action type="Redirect" url="http://www.dominio.it/{R:0}" redirectType="Permanent" />
</rule>

2.9. Qualora avreste la necessità di reindirizzare tutti gli indirizzi delle vostre pagine al protocollo HTTPS (perché lo avete appena attivato oppure perché i vostri visitatori non sanno che lo state utilizzando sul sito), inserite questo codice:

<rule name="redirect to https" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
</rule>

2.10. Inoltre, dobbiamo ricordarci che per i motori di ricerca gli URL http://www.dominio.it/ e http://www.dominio.it sono diversi. Di conseguenza, bisogna decidere quale URL utilizzare: quello con il slash finale o quello senza. Per togliere il slash finale dagli indirizzi di tutte le pagine del vostro sito, inserite il seguente codice:

<rule name="remove trailing slash" stopProcessing="true">
  <match url="(.*)/$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="{R:1}" />
</rule>

2.11. Invece per aggiungerlo sempre, utilizzate questo codice:

<rule name="add trailing slash" stopProcessing="true">
  <match url="(.*[^/])$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="{R:1}/" />
</rule>

2.12. A volte potrebbe anche essere utile sostituire a tutti i file l’estensione .htm con l’estensione .html – in tal caso inserite il seguente codice:

<rule name="htm to html" stopProcessing="true">
<match url="^(.*)\.htm$" />
<action type="Rewrite" url="/{R:1}.html" />
</rule>

Tutte le regole del web.config illustrate su questa pagina (a eccezione del reindirizzamento da una pagina all’altra) vanno inserite al posto dei puntini di questo codice:

<configuration>
  <system.webServer>
    <rewrite>
      ...
    </rewrite>
  </system.webServer>
</configuration>

Il reindirizzamento realizzabile con uno script è descritto nel paragrafo successivo.