Introduzione

Quando il tuo sito web o la tua applicazione sono attivi e in esecuzione con un dominio, è spesso preferibile consentire agli utenti di accedervi sia tramite il semplice nome di dominio che tramite www. Sebbene ci siano molti modi per configurarlo, la soluzione migliore, per coerenza e considerazioni SEO, è scegliere quale dominio preferisci, semplice o www e reindirizzare l'altro al dominio preferito. Questo tipo di reindirizzamento è chiamato Permanent Redirect, oppure “301 redirect” e può essere facilmente impostato configurando correttamente i record delle risorse DNS e il Web Server.

Questo tutorial vi mostrerà come reindirizzare un URL www verso non-www e viceversa, ad esempio www.esempio.it a esempio.it, con Apache su Ubuntu 18.04.

Prerequisiti

In questo tutorial si presuppone che si disponga di privilegi di superuser, ovvero sudo o root, sul server che esegue Apache. Se non lo hai già impostato, segui questo tutorial: Configurazione iniziale Ubuntu 18.04 LTS.

Si presume che Apache sia installato. Se non è installato segui questo tutorial: Come installare LAMP (Apache MySQL PHP) su Ubuntu 18.04 LTS.

Inoltre è necessario avere a disposizione uno nome dominio attivo e funzionante. Se i record DNS sono già attivi e correttamente configurati, saltate il paragrafo successivo.

Configura i record DNS

Per impostare il redirect desiderato,  www.esempio.it a esempio.it o viceversa, è necessario disporre di un record A per ciascun nome.

L'hostname deve essere il tuo dominio, ad esempio esempio.it, e l'indirizzo IP deve essere impostato sull'indirizzo IP pubblico del tuo server Apache. Ciò creerà automaticamente un record A che indirizza il tuo dominio all'indirizzo IP specificato.

Successivamente, aggiungi un altro record A con "www" come hostname (oppure "www.esempio.it " se solo "www" non funziona) e specifica lo stesso indirizzo IP.

Nota: questo funzionerà anche con i record CNAME, purché il record A del nome canonico si riferisca all'indirizzo IP del server Web Apache.

Ora il tuo server dovrebbe essere accessibile tramite il dominio www e non www, ma dobbiamo ancora impostare il redirect.

Abilitare Rewrite Module

Per eseguire il redirect 301, utilizzeremo il modulo Apache mod_rewrite. In questo modo, gli utenti potranno accedere al tuo sito con o senza il prefisso www e verrà reindirizzato al dominio che preferisci.

Innanzitutto, abilita il modulo mod_rewrite con questo comando:

sudo a2enmod rewrite

Riavviare Apache:

sudo service apache2 restart

Con il modulo Rewrite abilitato, possiamo configurare Apache con le regole di redirect usando il file .htaccess oppure inserendo le regole di redirect direttamente nel file di configurazione di Apache.

Vediamo prima come impostare le regole di redirect direttamente nel file di configurazione di Apache. Se volete utilizzare il file .htaccess per impostare le regole di redirect, saltate il paragrafo successivo.

Redirect con il file .conf di Apache - 1° Metodo

Vediamo come creare le regole di redirect nel file di configurazione di Apache senza dover abilitare e creare l'htaccess.

Aprire il file di configurazione di  Apache:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Il file dovrebbe essere simile al seguente:

<VirtualHost *:80>
	...

	ServerAdmin [email protected]
	DocumentRoot /var/www/html

	...
    
	ServerName TUO_NOME_DOMINIO.it
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	...

</VirtualHost>

Aggiungere le seguenti righe di codice prima della chiusura del tag </Virtualhost>, per impostare il redirect da www a non-www:

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

Trova la DocumentRoot del tuo sito e prendine nota. Per impostazione predefinita, la cartella principale (DocumentRoot ) è /var/www/html, quindi utilizzeremo questa directory nella nostra configurazione di esempio.

Aggiungi la seguente direttiva Directory alla fine del file e assicurati di sostituire DocumentRoot con la vostra directory (se è diversa) altrimenti lasciare la seguente:

 <Directory /var/www/html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
 </Directory>

Quindi, il risultato sarà simile al seguente:

<VirtualHost *:80>
	...

	ServerAdmin [email protected]
	DocumentRoot /var/www/html

	...
    
	ServerName TUO_NOME_DOMINIO.it
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

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

</VirtualHost>

 <Directory /var/www/html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
 </Directory>

Riavviare Apache:

sudo service apache2 restart

Se invece vuoi effettuare il redirect inverso, ovvero da non-www a www modificare le righe di codice in questo modo:

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

Quindi riavviare Apache:

sudo service apache2 restart

A questo punto il redirect per Apache dovrebbe funzionare correttamente, senza l'utilizzo del file .htaccess.

Se utilizzi i certificati SSL, quindi hai una connessone attiva con il protocollo HTTPS e vuoi effettuare un redirect da www a non-www (o viceversa) e da HTTP a HTTPS, consiglio di utilizzare l'htaccess ( il 2° metodo, paragrafo successivo).

Abilitare il file .htaccess - 2° Metodo

Se hai seguito il metodo precedente dovresti già avere un redirect configurato correttamente e non hai bisogno di continuare a leggere. Se vuoi utilizzare il file .htaccess per configurare il redirect continuare a leggere.

Per abilitare l'.htaccess apri il tuo file di configurazione di Apache. Su Ubuntu, il file di configurazione predefinito si trova in /etc/apache2/sites-enabled/000-default.conf, quindi aprire il file:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Trova la DocumentRoot del tuo sito e prendine nota. Per impostazione predefinita, la cartella principale (DocumentRoot ) è /var/www/html, quindi utilizzeremo questa directory nella nostra configurazione di esempio.

Aggiungi la seguente direttiva Directory alla fine del file e assicurati di sostituire DocumentRoot con la vostra directory (se è diversa) altrimenti lasciare la seguente:

 <Directory /var/www/html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
 </Directory>

Salvare e chiudere il file premendo CTRL+X, seguito da Y per salvare le modifiche e quindi ENTER se stai utilizzando nano.

Il file di configurazione adesso dovrebbe essere simile al seguente:

<VirtualHost *:80>
	...

	ServerAdmin [email protected]
	DocumentRoot /var/www/html

	ServerName pieronoviello.it
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	...

</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

 <Directory /var/www/html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
 </Directory>

Ora riavvia Apache per rendere effettiva la modifica:

sudo service apache2 restart

Apache è configurato per leggere i file .htaccess situati ovunque nella directory /var/www/html. Aggiungiamo ora le regole di riscrittura per il redirect.

Adesso creare o modificare il file .htaccess per abilitare le regole di redirect. Spostiamoci di directory verso la DocumentRoot, nel nostro caso /var/www/html:

cd /var/www/html

Creiamo o modifichiamo il file .htaccess:

sudo nano .htaccess

Naturalmente, se non hai ancora creato il file, sarà vuoto. Adesso impostiamo il redirect da www a non-www oppure da non-www a www.

Redirect da www a non-www

Se desideri reindirizzare gli utenti da www a  non www, inserisci questa configurazione:

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

Salvare e chiudere il file premendo CTRL+X, seguito da Y per salvare le modifiche e quindi ENTER se stai utilizzando nano.

Le modifiche dovrebbero entrare in vigore immediatamente. Se si utilizza HTTPS, è necessario modificare le regole in questo modo:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

Redirect da non-www a www

Se desideri reindirizzare gli utenti da non-www a  www, inserisci questa configurazione:

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

Salvare e chiudere il file premendo CTRL+X, seguito da Y per salvare le modifiche e quindi ENTER se stai utilizzando nano.

Le modifiche dovrebbero entrare in vigore immediatamente. Se si utilizza HTTPS, è necessario modificare le regole in questo modo:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

Conclusione

In questo tutorial abbiamo imparato a configurare le regole di redirect per Apache2 da www a non-www e viceversa, e per http verso https. Abbiamo visto due metodi diversi, utilizzando direttamente il file di configurazione di Apache2 e utilizzando il file .htaccess.

Questo è tutto! Il redirect di Apache è ora configurato correttamente.