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 Nginx 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 Nginx. Se non lo hai già impostato, segui questo tutorial: Configurazione iniziale Ubuntu 18.04 LTS.

Si presume che Nginx sia installato. Se non è installato segui questo tutorial: Come installare Linux Nginx MySQL PHP (LEMP) in 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 Nginx. 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 Nginx.

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

Impostare il redirect www a non-www

Impostare le regole di redirect da www a non-www e viceversa con Nginx è molto semplice.

Aprire il file di configurazione di  Nginx:

sudo nano /etc/nginx/sites-available/default

Il file di default dovrebbe essere simile al seguente, verificare se nel parametro server_name è impostato il tuo nome dominio senza il www:

server {
        listen 80;
        listen [::]:80;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name TUO_DOMINIO.it;

        location / {
                try_files $uri $uri/ =404;
        }
}

Aggiungere le seguenti righe di codice all'inizio del file, modificare il parametro server_name con il tuo dominio e il www e modificare il return 301 con l'indirizzo del dominio senza il www, in questo modo:

server {
    listen       80;
    server_name  www.TUO_DOMINIO.it;
    return       301 http://TUO_DOMINIO.it$request_uri;
}

Quindi, il risultato sarà simile al seguente:

server {
    listen       80;
    server_name  www.TUO_DOMINIO.it;
    return       301 http://TUO_DOMINIO.it$request_uri;
}


server {
        listen 80;
        listen [::]:80;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name TUO_DOMINIO.it;

        location / {
                try_files $uri $uri/ =404;
        }
}

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

Riavviare Nginx:

sudo service nginx restart

A questo punto il redirect per Nginx da www a non-www dovrebbe funzionare correttamente.

Impostare il redirect non-www a www

Al contrario, per impostare le regole di redirect da non-www a www è necessario semplicemente invertire i server_name e il redirect 301 rispetto alla configurazione precedente.

Aprire il file di configurazione di  Nginx:

sudo nano /etc/nginx/sites-available/default

Il file di default dovrebbe essere simile al seguente, verificare se nel parametro server_name è impostato il tuo nome dominio con il www:

server {
        listen 80;
        listen [::]:80;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name www.TUO_DOMINIO.it;

        location / {
                try_files $uri $uri/ =404;
        }
}

Aggiungere le seguenti righe di codice all'inizio del file, modificare il parametro server_name con il tuo dominio e senza il www e modificare il return 301 con l'indirizzo del dominio con il www, in questo modo:

server {
    listen       80;
    server_name  TUO_DOMINIO.it;
    return       301 http://www.TUO_DOMINIO.it$request_uri;
}

Quindi, il risultato sarà simile al seguente:

server {
    listen       80;
    server_name  TUO_DOMINIO.it;
    return       301 http://www.TUO_DOMINIO.it$request_uri;
}


server {
        listen 80;
        listen [::]:80;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name www.TUO_DOMINIO.it;

        location / {
                try_files $uri $uri/ =404;
        }
}

A questo punto il redirect per Nginx da www a non-www dovrebbe funzionare correttamente.

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

Riavviare Nginx:

sudo service nginx restart

Le modifiche dovrebbero entrare in vigore immediatamente.

Impostare il redirect www a non-www con HTTPS

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 continuare a leggere.

Aprire il file di configurazione di  Nginx:

sudo nano /etc/nginx/sites-available/default

Aggiungere un nuovo blocco server all'inizio del file per gestire le connessioni HTTP ed effettuare un redirect verso l'HTTPS. Modifica il parametro server_name inserendo il tuo nome dominio sia senza www che con www, modifica anche il parametro return impostato l'url preferito, nel nostro caso la versione senza www, in questo modo:

server {
    listen 80;
    listen [::]:80;
    server_name TUO_DOMINIO.it www.TUO_DOMINIO.it;
    return 301 https://TUO_DOMINIO.it$request_uri;
}

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

Modificare il blocco server principale. Cambiare il parametro Listen con la porta 443 e aggiungere il parametro ssl. Includere il percorso dei propri certificati, se non sono già inclusi, e alla fine del blocco aggiungere una condizione if che imposta un redirect automatico verso l'url preferito, in queso caso senza www. Se preferisci creare un redirect da non-www a www invertire i parametri server_name e return in entrambi i blocchi server.

server {
    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl; 
    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;
    server_name TUO_DOMINIO.it www.TUO_DOMINIO.it;

    location / {
        try_files $uri $uri/ =404;
    }


	#include your certificates
    ...


    if ($host = 'www.TUO_DOMINIO.it') {
        return 301 https://TUO_DOMINIO.it$request_uri;
    }

}

Quindi la configurazione finale con redirect da www a non-www con https abilitato è la seguente:

server {
    listen 80;
    listen [::]:80;
    server_name TUO_DOMINIO.it www.TUO_DOMINIO.it;
    return 301 https://TUO_DOMINIO.it$request_uri;
}

server {
    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl; 
    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;
    server_name TUO_DOMINIO.it www.TUO_DOMINIO.it;

    location / {
        try_files $uri $uri/ =404;
    }


	#include your certificates
    ...


    if ($host = 'www.TUO_DOMINIO.it') {
        return 301 https://TUO_DOMINIO.it$request_uri;
    }

}

Riavviare Nginx:

sudo service nginx restart

Le modifiche dovrebbero entrare in vigore immediatamente.

Conclusione

In questo tutorial abbiamo imparato a configurare le regole di redirect per Nginx da www a non-www e viceversa, e per http verso https.

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