# Redirect con Apache: istruzioni di redirect per CentOS e Ubuntu

I redirect di Apache sono utili per una varietà di situazioni. Tra l’altro, potete usare i pratici redirect per dirigere i visitatori **dalla versione HTTP a quella HTTPS** del vostro sito web, reindirizzare 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 configurare i redirect di Apache su CentOS e Ubuntu.

## Redirect 301 o 302: qual è la differenza?

Quando si guardano i redirect, è importante distinguere tra redirect 301 e 302. Il primo codice di stato (301) indica una **deviazione permanente**, mentre il secondo (302) indica una **deviazione temporanea**.

Un redirect 301 è molto più auspicabile da un punto di vista SEO. Se un [crawler SEO](https://www.ionos.it/digitalguide/online-marketing/marketing-sui-motori-di-ricerca/che-cose-un-crawler/) incontra un redirect di questo tipo, capisce che è un redirect permanente. Per questo motivo, non solo annota il nuovo URL, ma avvia anche il processo di trasferimento di qualsiasi **valore di Page Rank** dal vecchio URL a quello nuovo. Il **ranking SEO già raggiunto** viene di conseguenza preservato.

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 temporaneo** e l’**URL “reale” tornerà presto online**.

Consiglio Quando si crea un redirect, specificare sempre che si tratta di un redirect 301. In molte situazioni, il redirect è di default 302 se il tipo di redirect non viene specificato.

## Redirect 301 Apache: nozioni di base

Se avete solo bisogno di reindirizzare **un singolo URL** o un **piccolo numero di URL**, potete facilmente contrassegnarli individualmente nel file di configurazione Apache del vostro progetto.

### Semplice redirect dell’URL

Per un **singolo redirect 301**, usate la direttiva redirect nel file di configurazione di Apache. La sintassi è la seguente:

```none
Redirect 301 [vecchio URL] [nuovo URL]
```

Il nuovo URL può anche essere un **URL esterno**. In questo modo, agli utenti può essere comunicato, ad esempio, l’URL facile da ricordare *example.com/store*, invece di dover trasmettere il lungo e complicato URL di una pagina di negozio Amazon. Il prossimo esempio reindirizza il traffico da *example.com/store* a una **pagina del negozio Amazon**:

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

La direttiva redirect di Apache deve essere sempre inclusa nel **blocco di comando VirtualHost** nel file di configurazione principale del server web. Per impostazione predefinita, 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 configurazione di Apache possono variare, a seconda di come voi o il vostro amministratore del server avete impostato l’hosting.

Modificate questo file con un editor a vostra scelta, per esempio l’editor a riga di comando nano.

**CentOS:**

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

**Ubuntu:**

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

Scorrete il file fino a trovare il blocco di comando VirtualHost, che assomiglia a questo:

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

Ora aggiungete la direttiva di inoltro di Apache al blocco di comando VirtualHost. Quando lo fate, assicuratevi di mettere la policy al di fuori dei blocchi di comando della directory:

```none
<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:**

```none
sudo systemctl restart httpd
```

**Ubuntu:**

```none
sudo service apache2 restart
```

### Apache: inoltro di una directory

Potete anche **reindirizzare** una **sottodirectory** sulla vostra pagina corrente nello stesso modo. Per esempio, diciamo che volete spostare il blog del vostro sito web da una sottodirectory *(’http://example.com/blog*’) al vostro dominio canonico *(‘http://blog.example.com’*). La politica di reindirizzamento di Apache si presenta così:

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

### Redirect da domini www a domini non-www

È comune trasferire la versione www di un URL alla versione non-www (o viceversa) tramite una riga “**ServerAlias**” nel file di configurazione di Apache. Anche se questo approccio funziona bene dal punto di vista dei visitatori, non è considerato la soluzione migliore dal punto di vista SEO. L’uso di “ServerAlias” invece di un redirect 301 comporta il rischio che il contenuto in questione possa essere contrassegnato come [contenuto duplicato](https://www.ionos.it/digitalguide/online-marketing/marketing-sui-motori-di-ricerca/cose-il-contenuto-duplicato/ "Cos’è il contenuto duplicato?"). In linea di principio, tuttavia, non c’è alcuna differenza tra la versione www e la versione non-www di un URL da un punto di vista SEO. È importante scegliere una variante.

Di seguito, **reindirizziamo** il **traffico di www alla variante non-www**. Per questo abbiamo anche bisogno del file di configurazione principale di Apache, che si apre di nuovo con un editor a vostra scelta, per esempio con l’editor a riga di comando nano.

**CentOS:**

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

**Ubuntu:**

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

Cercate la seguente riga nel blocco di comando (con il dominio individuale del vostro progetto):

```none
ServerAlias www.example.com
```

Cancellate questa riga e scorrete fino alla fine del file. Aggiungete il seguente nuovo blocco di comando “VirtualHost”:

```none
<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, flessibile e potente e vi dà la possibilità di **manipolare facilmente gli URL**. Potete anche definire le regole appropriate in un [file .htaccess](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/trucchi-per-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 configurazione di base del modulo. Per prima cosa aprite il file con l’editor nano:

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

Aggiungete la seguente riga o attivatela se è stata commentata:

```none
LoadModule rewrite_module modules/mod_rewrite.so
```

Nel passo successivo, attivate l’uso dei file .htaccess. Per fare questo, aprite il file di configurazione principale di Apache.

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

Scorrete verso il basso fino al blocco di comando principale di VirtualHost, che come detto deve assomigliare a questo:

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

Cambiate la voce per “AllowOverride” da “None” a “**All**”:

```none
AllowOverride All
```

Se la voce della directory manca nel blocco di comando VirtualHost, aggiungetela manualmente:

```none
<directory " var www example.com html"></directory>
	AllowOverride All
```

N.B. Assicuratevi di usare il percorso corretto della directory principale del vostro sito web.

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

```none
sudo systemctl restart httpd
```

### Attivare mod\_rewrite su Ubuntu

Per abilitare mod\_rewrite su un server Ubuntu, usate il seguente comando:

```none
sudo a2enmod rewrite
```

Riavviate Apache affinché le modifiche abbiano effetto:

```none
sudo service apache2 restart
```

Successivamente, permettete l’uso di file .htaccess. Per farlo, modificate il file di configurazione principale di Apache:

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

Scorrete fino al blocco di comando principale di VirtualHost e trovate il blocco di comando directory (Directory), che deve assomigliare a questo:

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

Nella linea “AllowOverride” sostituite la voce predefinita “None” con “**All**”:

```none
AllowOverride All
```

Se la voce della directory manca nel blocco di comando VirtualHost, aggiungetela manualmente:

```none
<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:

```none
sudo service apache2 restart
```

### Creare il file .htaccess per l’inoltro di Apache

Dopo aver configurato Apache per utilizzare mod\_rewrite e permettere i file .htaccess, è il momento di andare nella directory dei documenti (directory principale) del vostro sito web e **creare un file .htaccess**.

N.B. Non è necessario riavviare Apache dopo aver apportato modifiche a un file .htaccess.

Se non avete fatto alcuna modifica, passate direttamente alla directory principale del vostro server web Apache con la seguente voce:

```none
cd /var/www/html
```

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

```none
sudo nano .htaccess
```

Specificate le vostre **configurazioni individuali di mod\_rewrite**. Iniziate con un semplice test per assicurarvi che tutto funzioni correttamente aggiungendo le seguenti righe a questo file:

```none
RewriteEngine on
RewriteRule ^hello.html$ goodbye.html
```

Questa regola reindirizza 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:

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

Ora richiamate la pagina *hello.html* in un browser. Sarete reindirizzati a *goodbye.html* tramite redirect di Apache e vedrete il messaggio “Goodbye”.

## Reindirizzare diversi domini allo stesso URL tramite redirect di Apache

Ci sono diverse ragioni per cui dovreste reindirizzare diversi domini allo stesso indirizzo:

- Se il vostro sito principale è *example.com*, potete catturare in modo ottimale lo **spazio dei nomi** acquistando *example.net* e *example.org*.
- Ha senso registrare anche i tipici **errori di battitura** del vostro nome di dominio come *exampl.com* o *exmple.com* e includerli nella vostra strategia. Questo vi protegge anche dal cosiddetto [typosquatting](https://www.ionos.it/digitalguide/domini/suggerimenti-sui-domini/come-proteggere-il-vostro-dominio-dal-typosquatting/).
- Potete anche semplicemente avere delle **varianti** del vostro nome di dominio, come *the-example.com* o *my-example.com*, che, una volta richiamati, dovrebbero anche portare i visitatori al vostro progetto web.

Anche se potete reindirizzare questi nomi di dominio alla vostra pagina principale nel solito modo, è consigliabile da un punto di vista SEO impostare dei redirect 301 per raggiungere gli obiettivi prefissati.

Per **reindirizzare diversi domini allo stesso dominio tramite redirect di Apache**, attivate prima il modulo mod\_rewrite come descritto nella sezione precedente e impostate un file .htaccess adatto. Poi aggiungete le seguenti righe al file .htaccess:

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

Nell’esempio, il traffico viene reindirizzato da *example.net* a *example.com*. Ora basta adattare questa regola ai vostri nomi di dominio e ai risultati desiderati. Per esempio, per reindirizzare il traffico alla versione www dell’URL (*‘www.example.com*’), dovete usare il seguente codice:

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

## Apache: come reindirizzare le pagine HTTP a HTTPS

Per la sicurezza dei vostri utenti e il vostro posizionamento nei motori di ricerca, è di fondamentale importanza che tutto il traffico sul vostro [sito web via SSL/TLS sia protetto](https://www.ionos.it/digitalguide/siti-web/creare-siti/come-si-migra-una-pagina-da-http-a-ssl-e-https/ "Come si migra una pagina da HTTP a SSL e HTTPS?"). Anche per questo caso, potete lavorare con un redirect Apache 301, che reindirizza automaticamente i visitatori alla versione HTTPS delle vostre pagine.

Anche in questo caso, prima impostate mod\_rewrite e il file .htaccess e poi aggiungete le seguenti righe al file di configurazione:

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

### Rinominare le pagine web e spostare le directory

Ci sono situazioni in cui è necessario rinominare **una pagina esistente** o **una directory esistente**. Ciò sospenderà tutti i link che si rivolgono a quella pagina, il che non solo diminuisce l’esperienza dell’utente, ma colpisce anche la vostra ottimizzazione SEO.

Usate le seguenti regole nel file .htaccess (dopo aver impostato i file mod\_rewrite e .htaccess).

**Rinominate il sito web:**

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

**Rinominate la directory:**

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

Negli esempi precedenti, i nomi dei file e delle directory sono dati come un percorso relativo alla directory principale 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 principale come /new-page.html
- un **URL assoluto** come ‘http://example.com/new-page.html’

## Le informazioni più importanti su mod\_rewrite in sintesi

Il modulo mod\_rewrite **utilizza espressioni regolari** per abbinare e sostituire gli URL. Per attivare mod\_rewrite, la prima riga delle regole nel file .htaccess deve sempre essere così:

```none
RewriteEngine on
```

Il **cuore** di mod\_rewrite è composto dalle **RewriteRules**. Ogni RewriteRule consiste di tre parti:

```none
RewriteRule [pattern] [substitution] [flags]
```

Il **modello** è creato con l’aiuto di espressioni regolari. Si possono fare le seguenti sostituzioni:

- un percorso completo del file system
- un percorso web relativo alla directory principale
- un URL assoluto

I **flag** sono facoltativi. Alcuni dei più comuni sono:

- L: indica che questa è l’ultima di una serie di regole
- R=301: forza un reindirizzamento 301
- NC: ignora le maiuscole/minuscole in modo che la regola non distingua tra maiuscole e minuscole

Per una lista completa dei flag disponibili, consultate il [sito ufficiale di Apache](https://httpd.apache.org/docs/current/rewrite/flags.html "Apache: i flag di RewriteRule in sintesi").

In alcuni casi, una RewriteRule è **introdotta da una RewriteCond**. Questo definisce le condizioni sotto le quali la RewriteRule ha effetto. Anche un RewriteCond è composto da tre parti:

```none
RewriteCond [test string] [condition] [flags]
```

La **stringa di testo** è tipicamente una variabile del server con il formato %{NOME DELLA VARIABILE}.

Ci sono tre tipi di **condizioni** (condition):

- Espressioni regolari
- Confronti di stringhe
- Test di file/percorso

I **flag** sono anche facoltativi in questo caso. Sono disponibili tre flag per il RewriteCond:

- NC: ignora le maiuscole/minuscole, quindi la condizione non è case-sensitive
- OR: logico “o”
- NV (“No Vary”): il nome dell’intestazione non è inserito nell’intestazione di risposta Vary

## Qual è la differenza tra RewriteRule e redirect?

Sia RewriteRule che redirect 301 di Apache possono essere contrassegnati in un file .htaccess per reindirizzare il traffico del sito web. La differenza principale è che una RewriteRule è implementata dal modulo mod\_rewrite e un redirect dal modulo mod\_alias.

<table>
  <thead>
    <tr>
      <th>mod\_rewrite</th>
      <th>mod\_alias</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>usa RewriteRule e RewriteCond</td>
      <td>usa Redirect e RedirectMatch</td>
    </tr>
    <tr>
      <td>molto versatile in quanto utilizza le espressioni regolari per abbinare e sostituire gli URL</td>
      <td>non configurabile più di tanto</td>
    </tr>
    <tr>
      <td>può essere difficile da usare</td>
      <td>facile da usare</td>
    </tr>
    <tr>
      <td>potrebbe non essere installato o attivato per impostazione predefinita</td>
      <td>già attivato per impostazione predefinita nella maggior parte delle installazioni di Apache</td>
    </tr>
  </tbody>
</table>


This is a markdown version of: [https://www.ionos.it/digitalguide/server/configurazione/redirect-con-apache/](https://www.ionos.it/digitalguide/server/configurazione/redirect-con-apache/) for AI/LLM consumption.