Redirect 301 tramite .htaccess

Articolo aggiornato a gennaio 2019

Indice dell’articolo

Redirect 301 tramite htaccessIn questo blog mi è capitato più volte di parlare di casi in cui diventa necessario modificare l’url di una pagina o addirittura l’intera struttura url di un sito.

Questo può avvenire per esempio quando si fa il cambio del dominio, quando si devono correggere url rotti o in situazioni in cui si vuole ottimizzare la struttura url per evitare problemi di duplicazione di contenuti.

In tutti questi casi è buona norma lato SEO utilizzare un redirect di tipo 30X (i più comuni sono il 301 ed il 302), per trasferire il “valore” (PageRank) di una pagina ad un’altra.

Anche se entrambe le tipologie di redirect sono SEO Friendly la differenza tra l’una e l’altra sta nell’indicazione chi si trasferisce al Motore di Ricerca.

Il Redirect 301 indica “Moved Permanently” cioé trasferito in modo permanente, mentre il Redirect 302 indica “Moved Temporarily” cioè trasferito temporaneamente, quindi il consiglio di base è: se la risorsa che stai reindirizzando non è destinata a tornare in uno stato 200, utilizza il 301, altrimenti utilizza il 302.

Tipologie di Redirect 301

Esistono diversi tipi di redirect come esistono diversi modi per fare un redirect, quello che vedremo oggi è uno dei casi più comuni con cui ci si trova a lavorare ovvero una Redirezione via mod_rewrite nel file htaccess su Apache.

Prima di spiegare la procedura faccio solo un accenno alle altre casistiche di redirezione in cui ci si può imbattere:

  • IIS: tramite configurazione del web server;
  • Cold fusion
    <.cfheader statuscode=”301″ statustext=”Moved permanently”>
    <.cfheader name=”Location” value=”http://www.new-url.com”>
  • PHP
    <?
    Header( “HTTP/1.1 301 Moved Permanently” );
    Header( “Location: http://www.new-url.com” );
    ?>
  •  ASP
    <%@ Language=VBScript %>
    <%
    Response.Status=”301 Moved Permanently”
    Response.AddHeader “Location”,”http://www.new-url.com/”
    %>
  • Asp net
    <script runat=”server”>
    private void Page_Load(object sender, System.EventArgs e)
    {
    Response.Status = “301 Moved Permanently”;
    Response.AddHeader(“Location”,”http://www.new-url.com”);
    }
    </script>
  • Java
    <%
    response.setStatus(301);
    response.setHeader( “Location”, “http://www.new-url.com/” );
    response.setHeader( “Connection”, “close” );
    %>
  • Perl
    $q = new CGI;
    print $q->redirect(“http://www.new-url.com/”);
  • Ruby
    def old_action
    headers[“Status”] = “301 Moved Permanently”
    redirect_to “http://www.new-url.com/”
    end

Redirect via mod_rewrite nel file htaccess su Apache

Andiamo ora a vedere nel dettaglio come si effettua un redirect tramite file .htaccess.

Innanzitutto i Redirect tramite file .htaccess possono essere implementati su siti che utilizzano server Apache.

Uno dei moduli più famosi di Apache che si utilizza per le redirezioni è il mod_rewrite attraverso il quale è possibile associare un URL virtuale (non residente sul filesystem) ad un URL reale, tramite delle regole definite nei file .htaccess.

La maggior parte delle installazioni di Apache ha il mod_rewrite installato di default altrimenti è possibile installarlo in autonomia o chiedendo al gestore del server.

Per utilizzare il mod_rewrite , il rewrite engine deve essere attivato con la direttiva:

RewriteEngine On

A questa direttiva segue la RewriteRule (cioè la Regola di Rewrite) in cui sono definite le indicazioni per l’URL Rewriting attraverso le espressioni regolari (o Regex).

Le regole di rewrite sono formate essenzialmente da 3 argomenti separati da spazi;

  • Pattern (Pattern) : quali URL dovrebbero essere influenzati dalla regola;
  • Sostituzione (Substitution) : dove devono essere inviate le richieste di abbinamento (redirezione);
  • [contrassegni] (flags) : opzioni che riguardano la richiesta di redirezione.

Sintassi di una Regola di RewriteEsempi comuni di redirect 301 per la SEO

SINGOLO REDIRECT

Redirect 301 pagina1.html http://www.miosito.com/pagina2.html

DA NON WWW A WWW

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

DA WWW A NON WWW

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

DA INDEX A ROOT

RewriteEngine on 
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://www.miosito.com/$1 [R=301,L]

DA HTTP A HTTPS

RewriteEngine on 
RewriteCond %{HTTPS} off
RewriteRule (.*) http://%{HTTPS_HOST}%{REQUEST_URI} [L,R=301]

DA HTTPS A HTTP

RewriteEngine on 
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

DA VECCHIO DOMINIO A NUOVO DOMINIO HTTP

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?nuovodominio\.it$ [NC] 
RewriteRule .* http://www.nuovodominio.it%{REQUEST_URI} [R=301,L]

DA VECCHIO DOMINIO A NUOVO DOMINIO HTTPS

RewriteCond %{HTTPS} on 
RewriteCond %{HTTP_HOST} !^(www\.)?nuovodominio\.it$ [NC] 
RewriteRule .* https://www.nuovodominio.it%{REQUEST_URI} [R=301,L]

REDIRECT URL CON QUERY STRING

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/pagina\.php$
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^(.*)$ http://www.miosito.com/page/%1.php [L,R=301]

Oltre ai metodi segnalati ne esistono molti altri ed ogni tipo di redirect è una storia a parte in base alle esigenze che si hanno ed in base alla struttura url con cui si a che fare.

Inserito in:
L'Autore

Stefano Salustri

Sono un Consulente in Digital Marketing con oltre 10 anni di esperienza. Mi occupo di progettare e sviluppare strategie digitali per Piccole e Medie Imprese per aiutare le aziende ad ottenere il massimo ritorno dagli investimenti nei canali online. 📈

40 commenti

                                      Lascia un commento

                                      Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *