I redirect di Apache sono utili per una varietà di si­tua­zio­ni. Tra l’altro, potete usare i pratici redirect per dirigere i vi­si­ta­to­ri dalla versione HTTP a quella HTTPS del vostro sito web, rein­di­riz­za­re il traffico da un URL www a uno non-www o anche cambiare i nomi di siti web e directory. Vi aiutiamo a capire e con­fi­gu­ra­re i redirect di Apache su CentOS e Ubuntu.

Server dedicati
Per­for­man­ce e in­no­va­zio­ne
  • Pro­ces­so­ri al­l'a­van­guar­dia di ultima ge­ne­ra­zio­ne
  • Hardware dedicato ad alte pre­sta­zio­ni
  • Data center cer­ti­fi­ca­ti ISO

Redirect 301 o 302: qual è la dif­fe­ren­za?

Quando si guardano i redirect, è im­por­tan­te di­stin­gue­re tra redirect 301 e 302. Il primo codice di stato (301) indica una de­via­zio­ne per­ma­nen­te, mentre il secondo (302) indica una de­via­zio­ne tem­po­ra­nea.

Un redirect 301 è molto più au­spi­ca­bi­le da un punto di vista SEO. Se un crawler SEO incontra un redirect di questo tipo, capisce che è un redirect per­ma­nen­te. Per questo motivo, non solo annota il nuovo URL, ma avvia anche il processo di tra­sfe­ri­men­to di qualsiasi valore di Page Rank dal vecchio URL a quello nuovo. Il ranking SEO già raggiunto viene di con­se­guen­za pre­ser­va­to.

Se invece un crawler rileva un redirect 302, esso prende nota del nuovo indirizzo e va avanti. A seconda del crawler, può segnare l’URL per una visita ripetuta in futuro. Questo accade perché un redirect 302 dovrebbe indicare che il redirect è solo tem­po­ra­neo e l’URL “reale” tornerà presto online.

Consiglio

Quando si crea un redirect, spe­ci­fi­ca­re sempre che si tratta di un redirect 301. In molte si­tua­zio­ni, il redirect è di default 302 se il tipo di redirect non viene spe­ci­fi­ca­to.

Redirect 301 Apache: nozioni di base

Se avete solo bisogno di rein­di­riz­za­re un singolo URL o un piccolo numero di URL, potete fa­cil­men­te con­tras­se­gnar­li in­di­vi­dual­men­te nel file di con­fi­gu­ra­zio­ne Apache del vostro progetto.

Semplice redirect dell’URL

Per un singolo redirect 301, usate la direttiva redirect nel file di con­fi­gu­ra­zio­ne di Apache. La sintassi è la seguente:

Redirect 301 [vecchio URL] [nuovo URL]

Il nuovo URL può anche essere un URL esterno. In questo modo, agli utenti può essere co­mu­ni­ca­to, ad esempio, l’URL facile da ricordare example.com/store, invece di dover tra­smet­te­re il lungo e com­pli­ca­to URL di una pagina di negozio Amazon. Il prossimo esempio rein­di­riz­za il traffico da example.com/store a una pagina del negozio Amazon:

Redirect 301 example.com/store https://www.amazon.com/s?marketplaceID=...

La direttiva redirect di Apache deve essere sempre inclusa nel blocco di comando Vir­tua­lHo­st nel file di con­fi­gu­ra­zio­ne prin­ci­pa­le del server web. Per im­po­sta­zio­ne pre­de­fi­ni­ta, il file può essere trovato nelle seguenti posizioni:

  • CentOS: /etc/httpd/conf.d/example.com.conf
  • Ubuntu: /etc/apache2/sites-available/example.com.conf
N.B.

La posizione e il nome del file di con­fi­gu­ra­zio­ne di Apache possono variare, a seconda di come voi o il vostro am­mi­ni­stra­to­re del server avete impostato l’hosting.

Mo­di­fi­ca­te questo file con un editor a vostra scelta, per esempio l’editor a riga di comando nano.

CentOS:

sudo nano /etc/httpd/conf.d/example.com.conf

Ubuntu:

sudo nano /etc/apache2/sites-available/example.com.conf

Scorrete il file fino a trovare il blocco di comando Vir­tua­lHo­st, che as­so­mi­glia a questo:

<virtualhost *:80></virtualhost>
ServerName example.com
	<directory " var www example.com html"></directory>
	AllowOverride All

Ora ag­giun­ge­te la direttiva di inoltro di Apache al blocco di comando Vir­tua­lHo­st. Quando lo fate, as­si­cu­ra­te­vi di mettere la policy al di fuori dei blocchi di comando della directory:

<virtualhost *:80></virtualhost>
ServerName example.com
Redirect 301 /blog https://blog.example.com
	<directory " var www example.com html"></directory>
	AllowOverride All

Salvate e chiudete il file, poi riavviate Apache affinché le modifiche abbiano effetto:

CentOS:

sudo systemctl restart httpd

Ubuntu:

sudo service apache2 restart

Apache: inoltro di una directory

Potete anche rein­di­riz­za­re una sot­to­di­rec­to­ry sulla vostra pagina corrente nello stesso modo. Per esempio, diciamo che volete spostare il blog del vostro sito web da una sot­to­di­rec­to­ry ('http://example.com/blog') al vostro dominio canonico ('http://blog.example.com'). La politica di rein­di­riz­za­men­to di Apache si presenta così:

Redirect 301 /blog https://blog.example.com

Redirect da domini www a domini non-www

È comune tra­sfe­ri­re la versione www di un URL alla versione non-www (o viceversa) tramite una riga “Ser­ve­rA­lias” nel file di con­fi­gu­ra­zio­ne di Apache. Anche se questo approccio funziona bene dal punto di vista dei vi­si­ta­to­ri, non è con­si­de­ra­to la soluzione migliore dal punto di vista SEO. L’uso di “Ser­ve­rA­lias” invece di un redirect 301 comporta il rischio che il contenuto in questione possa essere con­tras­se­gna­to come contenuto duplicato. In linea di principio, tuttavia, non c’è alcuna dif­fe­ren­za tra la versione www e la versione non-www di un URL da un punto di vista SEO. È im­por­tan­te scegliere una variante.

Di seguito, rein­di­riz­zia­mo il traffico di www alla variante non-www. Per questo abbiamo anche bisogno del file di con­fi­gu­ra­zio­ne prin­ci­pa­le di Apache, che si apre di nuovo con un editor a vostra scelta, per esempio con l’editor a riga di comando nano.

CentOS:

sudo nano /etc/httpd/conf.d/example.com.conf

Ubuntu:

sudo nano /etc/apache2/sites-available/example.com.conf

Cercate la seguente riga nel blocco di comando (con il dominio in­di­vi­dua­le del vostro progetto):

ServerAlias www.example.com

Can­cel­la­te questa riga e scorrete fino alla fine del file. Ag­giun­ge­te il seguente nuovo blocco di comando “Vir­tua­lHo­st”:

<virtualhost *:80></virtualhost>
	ServerName www.example.com
	Redirect 301 / https://example.com/

Salvate e chiudete il documento. Poi riavviate Apache affinché le modifiche abbiano effetto.

Redirect complessi di Apache con mod_rewrite

Per redirect 301 più complessi, il modulo Apache mod_rewrite è la scelta migliore. Questo modulo è veloce, fles­si­bi­le e potente e vi dà la pos­si­bi­li­tà di ma­ni­po­la­re fa­cil­men­te gli URL. Potete anche definire le regole ap­pro­pria­te in un file .htaccess.

Attivare mod_rewrite su CentOS

mod_rewrite è attivato di default su CentOS. Se trovate che non è stato attivato, potete sempre attivarlo nel file di con­fi­gu­ra­zio­ne di base del modulo. Per prima cosa aprite il file con l’editor nano:

sudo nano /etc/httpd/conf.modules.d/00-base.conf

Ag­giun­ge­te la seguente riga o at­ti­va­te­la se è stata com­men­ta­ta:

LoadModule rewrite_module modules/mod_rewrite.so

Nel passo suc­ces­si­vo, attivate l’uso dei file .htaccess. Per fare questo, aprite il file di con­fi­gu­ra­zio­ne prin­ci­pa­le di Apache.

sudo nano /etc/httpd/conf.d/example.com.conf

Scorrete verso il basso fino al blocco di comando prin­ci­pa­le di Vir­tua­lHo­st, che come detto deve as­so­mi­glia­re a questo:

<virtualhost *:80></virtualhost>
ServerName example.com
	<directory " var www example.com html"></directory>
	AllowOverride None

Cambiate la voce per “Al­lo­wO­ver­ri­de” da “None” a “All”:

AllowOverride All

Se la voce della directory manca nel blocco di comando Vir­tua­lHo­st, ag­giun­ge­te­la ma­nual­men­te:

<directory " var www example.com html"></directory>
	AllowOverride All
N.B.

As­si­cu­ra­te­vi di usare il percorso corretto della directory prin­ci­pa­le del vostro sito web.

Salvate e uscite dal file. Riavviate Apache affinché le modifiche abbiano effetto:

sudo systemctl restart httpd

Attivare mod_rewrite su Ubuntu

Per abilitare mod_rewrite su un server Ubuntu, usate il seguente comando:

sudo a2enmod rewrite

Riavviate Apache affinché le modifiche abbiano effetto:

sudo service apache2 restart

Suc­ces­si­va­men­te, per­met­te­te l’uso di file .htaccess. Per farlo, mo­di­fi­ca­te il file di con­fi­gu­ra­zio­ne prin­ci­pa­le di Apache:

sudo nano /etc/apache2/sites-available/example.com.conf

Scorrete fino al blocco di comando prin­ci­pa­le di Vir­tua­lHo­st e trovate il blocco di comando directory (Directory), che deve as­so­mi­glia­re a questo:

<directory var www example.com html></directory>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted

Nella linea “Al­lo­wO­ver­ri­de” so­sti­tui­te la voce pre­de­fi­ni­ta “None” con “All”:

AllowOverride All

Se la voce della directory manca nel blocco di comando Vir­tua­lHo­st, ag­giun­ge­te­la ma­nual­men­te:

<directory var www example.com html></directory>
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted

Salvate e uscite dal file. Riavviate il server web affinché le modifiche abbiano effetto:

sudo service apache2 restart

Creare il file .htaccess per l’inoltro di Apache

Dopo aver con­fi­gu­ra­to Apache per uti­liz­za­re mod_rewrite e per­met­te­re i file .htaccess, è il momento di andare nella directory dei documenti (directory prin­ci­pa­le) del vostro sito web e creare un file .htaccess.

N.B.

Non è ne­ces­sa­rio riavviare Apache dopo aver apportato modifiche a un file .htaccess.

Se non avete fatto alcuna modifica, passate di­ret­ta­men­te alla directory prin­ci­pa­le del vostro server web Apache con la seguente voce:

cd /var/www/html

Ora create il file .htaccess nella directory e apritelo con il seguente comando:

sudo nano .htaccess

Spe­ci­fi­ca­te le vostre con­fi­gu­ra­zio­ni in­di­vi­dua­li di mod_rewrite. Iniziate con un semplice test per as­si­cu­rar­vi che tutto funzioni cor­ret­ta­men­te ag­giun­gen­do le seguenti righe a questo file:

RewriteEngine on
RewriteRule ^hello.html$ goodbye.html

Questa regola rein­di­riz­za le richieste per hello.html alla pagina goodbye.html. Salvate e uscite dal file e poi create i due documenti HTML con i seguenti comandi:

sudo echo "Hello" >> hello.html
sudo echo "Goodbye" >> goodbye.html

Ora ri­chia­ma­te la pagina hello.html in un browser. Sarete rein­di­riz­za­ti a goodbye.html tramite redirect di Apache e vedrete il messaggio “Goodbye”.

Rein­di­riz­za­re diversi domini allo stesso URL tramite redirect di Apache

Ci sono diverse ragioni per cui dovreste rein­di­riz­za­re diversi domini allo stesso indirizzo:

  • Se il vostro sito prin­ci­pa­le è example.com, potete catturare in modo ottimale lo spazio dei nomi ac­qui­stan­do example.net e example.org.
  • Ha senso re­gi­stra­re anche i tipici errori di battitura del vostro nome di dominio come exampl.com o exmple.com e in­clu­der­li nella vostra strategia. Questo vi protegge anche dal co­sid­det­to ty­po­squat­ting.
  • Potete anche sem­pli­ce­men­te avere delle varianti del vostro nome di dominio, come the-example.com o my-example.com, che, una volta ri­chia­ma­ti, do­vreb­be­ro anche portare i vi­si­ta­to­ri al vostro progetto web.

Anche se potete rein­di­riz­za­re questi nomi di dominio alla vostra pagina prin­ci­pa­le nel solito modo, è con­si­glia­bi­le da un punto di vista SEO impostare dei redirect 301 per rag­giun­ge­re gli obiettivi pre­fis­sa­ti.

Per rein­di­riz­za­re diversi domini allo stesso dominio tramite redirect di Apache, attivate prima il modulo mod_rewrite come descritto nella sezione pre­ce­den­te e impostate un file .htaccess adatto. Poi ag­giun­ge­te le seguenti righe al file .htaccess:

RewriteEngine on
RewriteCond %{HTTP_Host} ^(www\.)?example\.net$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301]

Nell’esempio, il traffico viene rein­di­riz­za­to da example.net a example.com. Ora basta adattare questa regola ai vostri nomi di dominio e ai risultati de­si­de­ra­ti. Per esempio, per rein­di­riz­za­re il traffico alla versione www dell’URL ('www.example.com'), dovete usare il seguente codice:

RewriteEngine on
RewriteCond %{HTTP_Host} ^(www\.)?example\.net$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301]

Apache: come rein­di­riz­za­re le pagine HTTP a HTTPS

Per la sicurezza dei vostri utenti e il vostro po­si­zio­na­men­to nei motori di ricerca, è di fon­da­men­ta­le im­por­tan­za che tutto il traffico sul vostro sito web via SSL/TLS sia protetto. Anche per questo caso, potete lavorare con un redirect Apache 301, che rein­di­riz­za au­to­ma­ti­ca­men­te i vi­si­ta­to­ri alla versione HTTPS delle vostre pagine.

Anche in questo caso, prima impostate mod_rewrite e il file .htaccess e poi ag­giun­ge­te le seguenti righe al file di con­fi­gu­ra­zio­ne:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://example.com$1 [R=301,L]

Ri­no­mi­na­re le pagine web e spostare le directory

Ci sono si­tua­zio­ni in cui è ne­ces­sa­rio ri­no­mi­na­re una pagina esistente o una directory esistente. Ciò so­spen­de­rà tutti i link che si rivolgono a quella pagina, il che non solo di­mi­nui­sce l’espe­rien­za dell’utente, ma colpisce anche la vostra ot­ti­miz­za­zio­ne SEO.

Usate le seguenti regole nel file .htaccess (dopo aver impostato i file mod_rewrite e .htaccess).

Ri­no­mi­na­te il sito web:

RewriteEngine on
RewriteRule ^old-page.html$ /new-page.html [R=301]

Ri­no­mi­na­te la directory:

RewriteEngine on
RewriteRule ^old-directory/ /new-directory/ [R=301]

Negli esempi pre­ce­den­ti, i nomi dei file e delle directory sono dati come un percorso relativo alla directory prin­ci­pa­le del sito web. Ci sono tre opzioni per i percorsi:

  • un percorso completo del file system come /var/www/html/new-page.html
  • un percorso web relativo alla directory prin­ci­pa­le come /new-page.html
  • un URL assoluto come 'http://example.com/new-page.html'

Le in­for­ma­zio­ni più im­por­tan­ti su mod_rewrite in sintesi

Il modulo mod_rewrite utilizza espres­sio­ni regolari per abbinare e so­sti­tui­re gli URL. Per attivare mod_rewrite, la prima riga delle regole nel file .htaccess deve sempre essere così:

RewriteEngine on

Il cuore di mod_rewrite è composto dalle Rew­ri­te­Ru­les. Ogni Rew­ri­te­Ru­le consiste di tre parti:

RewriteRule [pattern] [substitution] [flags]

Il modello è creato con l’aiuto di espres­sio­ni regolari. Si possono fare le seguenti so­sti­tu­zio­ni:

  • un percorso completo del file system
  • un percorso web relativo alla directory prin­ci­pa­le
  • un URL assoluto

I flag sono fa­col­ta­ti­vi. Alcuni dei più comuni sono:

  • L: indica che questa è l’ultima di una serie di regole
  • R=301: forza un rein­di­riz­za­men­to 301
  • NC: ignora le maiuscole/minuscole in modo che la regola non distingua tra maiuscole e minuscole

Per una lista completa dei flag di­spo­ni­bi­li, con­sul­ta­te il sito ufficiale di Apache.

In alcuni casi, una Rew­ri­te­Ru­le è in­tro­dot­ta da una Rew­ri­te­Cond. Questo definisce le con­di­zio­ni sotto le quali la Rew­ri­te­Ru­le ha effetto. Anche un Rew­ri­te­Cond è composto da tre parti:

RewriteCond [test string] [condition] [flags]

La stringa di testo è ti­pi­ca­men­te una variabile del server con il formato %{NOME DELLA VARIABILE}.

Ci sono tre tipi di con­di­zio­ni (condition):

  • Espres­sio­ni regolari
  • Confronti di stringhe
  • Test di file/percorso

I flag sono anche fa­col­ta­ti­vi in questo caso. Sono di­spo­ni­bi­li tre flag per il Rew­ri­te­Cond:

  • NC: ignora le maiuscole/minuscole, quindi la con­di­zio­ne non è case-sensitive
  • OR: logico “o”
  • NV (“No Vary”): il nome dell’in­te­sta­zio­ne non è inserito nell’in­te­sta­zio­ne di risposta Vary

Qual è la dif­fe­ren­za tra Rew­ri­te­Ru­le e redirect?

Sia Rew­ri­te­Ru­le che redirect 301 di Apache possono essere con­tras­se­gna­ti in un file .htaccess per rein­di­riz­za­re il traffico del sito web. La dif­fe­ren­za prin­ci­pa­le è che una Rew­ri­te­Ru­le è im­ple­men­ta­ta dal modulo mod_rewrite e un redirect dal modulo mod_alias.

mod_rewrite mod_alias
usa Rew­ri­te­Ru­le e Rew­ri­te­Cond usa Redirect e Re­di­rect­Match
molto versatile in quanto utilizza le espres­sio­ni regolari per abbinare e so­sti­tui­re gli URL non con­fi­gu­ra­bi­le più di tanto
può essere difficile da usare facile da usare
potrebbe non essere in­stal­la­to o attivato per im­po­sta­zio­ne pre­de­fi­ni­ta già attivato per im­po­sta­zio­ne pre­de­fi­ni­ta nella maggior parte delle in­stal­la­zio­ni di Apache
Vai al menu prin­ci­pa­le