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.