• Come forzare il nome host canonico

    Al di là della configurazione dei server da parte del hosting provider, ci sono alcune configurazioni a scelta degli utenti dello spazio web. Ad esempio, la scelta di mostrare sempre www.dominio.tld al posto di dominio.tld potrebbe sembrare triviale, ma non lo è. Nel corso dell'evoluzione dei browser si è sempre cercato di semplificare e rendere più bello Internet, ma spesso senza fare i conti con l'implementazione tecnica dei server. Tecnicamente, www è un sottodominio, ma a differenza di tutti gli altri sottodomini, è obbligatorio e deve essere presente nella tabella DNS, pena di trovarsi emarginati e poco visitati.

    L'accettazione di www.dominio.tld e dominio.tld sembrerebbe quindi logica, ma presenta un problema di indicizzazione: i contenuti duplicati per via dell'intercambiabilità dei nomi di dominio, a cui si vanno ad aggiungere tutti gli altri sottodomini che si riferiscono allo stesso spazio web. I contenuti duplicati riducono la visibilità sui motori di ricerca, perché sono percepiti come spam, ossia eccessiva pubblicazione di contenuti uguali.

    Per evitare la riduzione di visibilità, uno dei trucchi più comuni è il redirect forzato alla versione più estesa, ossia www.dominio.tld. Il modulo mod_rewrite di Apache risolve il compito con disarmante facilità, a livello di spazio web nel file /.htaccess:
    Codice:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.dominio\.tld [NC]
    RewriteCond %{HTTP_HOST} !^$
    RewriteRule ^/(.*) http://www.dominio.tld/$1 [L,R]
    Il codice RewriteEngine On abilita il modulo mod_rewrite a livello .htaccess. Molte volte è già abilitato, perché oggigiorno quasi tutti i siti modificano le URL a livello di ingresso.

    La riga RewriteCond %{HTTP_HOST} !^www\.dominio\.tld [NC] esamina la variabile di server Apache HTTP_HOST e si imposta a true (vero), se non contiene www.dominio.tld, e il parametro [NC] indica che il caso di lettere è indifferente. In aggiunta esamina la riga successiva, RewriteCond %{HTTP_HOST} !^$, dove il nome host non deve essere vuoto, e se entrable le condizioni sono vere, allora genera un redirect con codice 302 a http://www.dominio.tld/$1 e termina l'evalutazione di .htaccess. La variabile $1 contiene i dati raccolti in (.*) della regola.

    Il comando RewriteCond è per valore predefinito congiuntivo (AND) con la prossima condizione, a meno che non si aggiunge il parametro finale [OR]. Il parametro [L] indica che la regola è l'ultima, se la condizione è stata soddisfatta, per cui è essenziale mettere i redirect globali quanto prima nel file .htaccess.

    Una versione altrettanto usata è:
    Codice:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.dominio\.tld [NC]
    RewriteRule ^(.*) http://www.dominio.tld/$1 [R,L]
    dove si omette la verifica di RewriteCond %{HTTP_HOST} !^$, perché il nome host non può, nella regola, essere vuoto. Visto che il file .htaccess viene aperto e interpretato per ogni file, il minore numero di condizioni riduce anche notevolmente i tempi di elaborazione e quindi aumenta la performance del sito.

    Se si desidera generare un codice redirect permanente (codice 301), che è meglio per indicizzare bene il sito e senza perdita di riferimenti, allora è necessario aggiungerlo nella regola, come ad esempio:
    Codice:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.dominio\.tld [NC]
    RewriteRule ^(.*) http://www.dominio.tld/$1 [R=301,L]