Istruzioni di uso del .htaccess – Esempi di Reindirizzamenti 301

In questo post ti descriverò l’utilizzo del file .htaccess presente sul tuo sito web per effettuare il redirect delle pagine. Abbiamo parlato dell’utilizzo di questo file anche in altri post però qui te lo descriverò più in dettaglio con degli esempi.

Introduzione su .htaccess

E’ un file che normalmente si trova nella root ma può essere inserito in qualsiasi directory del tuo host  ed ha la funzione di personalizzare impostazioni globali del server.  E’ uno strumento molto potente e anche molto delicato perchè ha il potere di riscrivere completamente le richieste in entrata, bloccare interi paesi, definire le pagine di errore o semplicemente controllare l’accesso alle cartelle e file. Se utilizzi CMS per il tuo sito come WordPress, Joomla, Silverstipe allora probabilmente hai già il file all’interno della root del tuo sito.

file-silze-file-nascosti[1]

Il file inizia con il punto (.) perchè per il server questi tipi di file sono file nascosti. Per questo prima di crearne uno nuovo verificate che il client FTP che utilizzate sia impostato per visualizzare i file nascosti come si vede nell’immagine per Filezilla.

Esempi

Prima di iniziare con qualche esempio bisogna sapere che ogni riga che inizia con # è una linea di commento. Questo lo puoi usare per descrivere il codice e riconoscere i comandi utilizzati.

Gestione degli errori del server

Una soluzione per gestire gli errori del server e reindirizzare l’utente e lo spider di Google a pagine ottimizzate per gli errori è appunto l’utilizzo del .htaccess.  Gli errori più comuni sono questi che segno, invece la lista completa si può trovare anche su wikipedia.

ErrorDocument 400 /errors/bad_request.html #Richiesta non valida
ErrorDocument 401 /errors/authentication_required.html           # #Autorizzazione negata
ErrorDocument 403 /errors/forbidden.html            ##Accesso negato
ErrorDocument 404 /errors/page_not_found.html            ##per non trovato
ErrorDocument 500 /errors/server_error.html            ##Errore interno del server

 

Bloccare un indirizzi IP

Se hai la necessità di bloccare utenti specifici oppure intervalli interi di indirizzi IP allora il seguente codice ti può aiutare:

order allow,deny
deny from 1.2.3.4           # Bloccare un singolo IP
deny from 1.2.3.            # Bloccare tutti IP da 1.2.3.0 a 1.2.3.255
allow from all

 

Cambiare la pagina index

La prima pagina che viene automaticamente caricata dal server quando si visita un dominio è il file index.html. Nel caso in qui abbiamo la necessità di cambiare possiamo usare questo codice:

DirectoryIndex nuovo_file_index.html     # Nuova pagina index
DirectoryIndex index_1.html index_2.html index_3.html # Il server passa uno ad uno finche non trova un file corretto.

 

Aggiungere o rimuovere  il www dal URL del dominio

# Da non www a www
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^miosito.it$ 
RewriteRule ^(.*)$ http://www.miosito.it/$1 [R=301,L]
# Da www a non www
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.miosito.it$ 
RewriteRule ^(.*)$ http://miosito.it/$1 [R=301,L]

 

Reindirizzamenti di URL

Se  nel tuo sito hai effettuato degli aggiornamenti come può essere un restyling o migrazione di dominio ecc  e ti ritrovi con tante richieste http che vanno a finire in errore 404 allora quello che ti serve sono dei “Redirect 301”

Se i tuoi errori 404 sono pochi, allora puoi adottare una soluzione facile come ad esempio:

Redirect 301 /vecchia-pagina.htm http://www.miosito.it/nuova-pagina.htm

Una soluzione migliore, anche se leggermente più complicata, è l’utilizzo del mod_rewrite. Un esempio concreto può essere:  riscrivere tutte le URL con suffisso  .html in .php , questo perchè abbiamo cambiato il sito statico in  dinamico.

<ifModule mod_rewrite.c>
RewriteRule ^(.*).Html$ http://www.miosito.com/$1.php[R=301,NC]
</ifModule>

Esempio di reindirizzamento di tutte quelle pagine che hanno all’interno del URL una variabile uguale del tipo.”http://www.miosito.it?pagina=4

<ifModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} pagina=(.*)$
RewriteRule . http://www.miosito.it/nuova-pagina? [R=301,L]
</ifModule>

Un altro esempio di utilizzo: Se il nostro sito si presenta con una stringa URL del tipo:  “http://www.miosito.it/eventi.php?categoria=musica&id=4”  si può trasformare in una URL seo-friendly del tipo: http://www.miosito.it/categoria/musica/4″   

<ifModule mod_rewrite.c>
RewriteRule ^categoria/([^/]*)/([^/]*)$ /eventi.php?categoria=$1&id=$2 [L]
</ifModule>

Se hai bisogno di un altro esempio specifico scrivi un commento, sarò felice di aiutarti.

A presto
Ertil Gani

Scritto da    |   aprile 16th, 2014   |   16 Commenti
Ertil Gani

16 Responses to Istruzioni di uso del .htaccess – Esempi di Reindirizzamenti 301
  • Gianluca scrive:
    Il tuo commento è in attesa di moderazione.

    Ciao. E’ possibile togliere lìestensione della lingua (es: /en) dall’url di Prestashop. Vorrei fare in modo che la home venga visualizzata come nomedominio.ext e non nomedominio.ext/en o /it.
    Si puà fare? Grazie e complimenti.

  • marcello scrive:

    Ciao
    Non riesco a venire a capo di come impostare correttamente l’htaccess per una situazione di questo tipo

    devo reindirizzare tutte le chiamate
    domain.ext vs. http://www.domain.ext
    ma solo per le chiamate http://nomedominio.ext/… e https://nomedominio.ext
    se invece viene richiesto ed esempio
    http://sub.domain.ext oppure http://www.sub.domain.ext non devo reindirizzare a http://www.domain.ext
    Come posso impostare la cosa ?
    Grazie per la risposta

  • Roberta scrive:

    Salve, grazie per la guida, dopo la migrazione ad altro dominio sto reindirizzando i vecchi url dal vecchio prestashop 1.4 al nuovo 1.6 tutti con mod rewrite abilitato ma mentre per gli url con estensione .html va tutto bene per le categorie e le pagine statiche senza estensione mi aggiunge una stringa, e non va bene, oppure addirittura reinderizza ad un’altra pagina. Il file htaccess è pieno di altre direttive, cosa posso fare?

    Ho provato in diversi modi: sul vecchio domino

    RewriteRule ^/it/8-foto-album https://www.capestoreonline.com/it/4-album-fotografici [R=301]

    ma ottengo reindirizzamento ad altra categoria

    https://www.capestoreonline.com/it/8-album-a-tasche-10×15-cm?id_category=8&isolang=it

    oppure

    Redirect 301 /it/content/2-termini-e-condizioni https://www.capestoreonline.com/it/content/3-termini-e-condizioni-d-uso
    ma ottengo questo

    https://www.capestoreonline.com/it/content/3-termini-e-condizioni-d-uso?isolang=it&id_cms=2
    è possibile eliminare la stringa finale?

    Grazie

  • Guido scrive:

    Ciao Ertil,

    devo passare ad altro software e.commerce e mi trovo nella classica posizione di dover fare redirect 301 a migliaia di pagine.
    Il vecchio software ancora in uso utilizza i seguenti Rewrite adottati anni fa per rendere parlanti gli url:

    RedirectMatch (/[^/]*-cat[0-9]+)/$ $1
    RedirectMatch (/[^/]*-cat[0-9]+)/(.*)$ /$2

    RewriteEngine on
    RewriteBase /
    RewriteRule ^([^/]*)/.*-([^\.-]+)\.htm$ dettview.php?cod=$2
    RewriteRule ^([^/]*)*-([^\.-]+)\.htm$ dettview.php?cod=$2

    RewriteRule ^[^/]*-(cat[0-9]+)/?$ $1.php [QSA]
    RewriteRule ^[^/]*-(cat[0-9]+)/(.*)$ $2 [QSA]

    Producendo i seguenti URL:

    URL Prodotti (circa 5000 articoli):
    https://www.mysite.it/Accessori-Cellulari/Auricolari-in-box-triangolare-MO8908.htm
    (url rewrite composto da nomecategoria-titoloprodotto-codiceprodotto.htm)
    Il nuovo url avrà lo stesso dominio ma naturalmente diversa destinazione

    URL Categorie (circa 150):
    https://www.mysite.it/Borse-e-Cartelle-cat228
    (url rewrite composto da nomecategoria-idcategoria)
    Il nuovo url avrà lo stesso dominio ma naturalmente diversa destinazione

    URL Ricerca:
    https://www.mysite.it/rel.php?id=Pen&page=0
    https://www.mysite.it/edselect.php?id_k=articoli%20in%20offerta&search=offerte
    (Ho attualmente 2 tipi di ricerche nel sito create dai file rel.php e edselect.php e vorrei semplicemente un 301 alla index)

    Quale strada intraprendere per fare dei corretti 301 a migliaia di url?

    Grazie in anticipo

    Guido

  • Paolo scrive:

    Ciao Ertil. Complimenti per tutto il blog. Mi hanno suggerito questo articolo per risolvere un problema che ho con joomla. In pratica tutte le url del sito rispondono sia con il suffisso html che snza suffisso, generando migliaia di duplicati.
    Mi occorrerebbe sapere se esiste e qual’é la regola rewrite per redirezionare tutte len url senza html alla versione con il.html. Spero potrai aiutarmi. Sinora buio totale in ogni dove. Grazie.

  • Giuseppe scrive:

    Buongiorno, avrei un problema e spero qualcuno possa aiutarmi…
    Di recente ho disattivato l’opzione “suffisso url” dal pannello impostazioni SEO nella configurazione globale. (uso Joomla!) Ovviamente tutti i link interni ora mi danno errore 404 in quanto le pagine che prima terminavano con .html ora non sono trovate. Avrei bisogno quindi di fare un redirect di tutte le pagine con suffisso .html a quelle nuove ( senza suffisso).
    Ho provato con questa stringa sul .htaccess:
    RedirectMatch (.*)\.html$ http://www.miosito.it$1
    Sebbene sembra eseguire il redirect per tutte le pagine, appare non funzionare solo per la homepage dove mi restituisce ora la pagina http://www.miosito.it/index e l’ errore pagina non trovata..
    Dove sbaglio? Spero qualcuno possa aiutarmi!
    Grazie,
    Giuseppe

    • Ertil Gani scrive:

      Ciao Giuseppe,
      grazie del tuo commento.
      Nel tuo caso il reindirizzamento è leggermente più complicato.

      # Prima di tutto bisogna rimovere l'estensione .html
      RewriteCond %{THE_REQUEST} ^GET\ (.*)\.html\ HTTP
      RewriteRule (.*)\.html$ $1 [R=301]


      # Non avendo una pagine per la nuova richiesta /index bisogna effettuare un reindirizzamento
      RewriteRule (.*)/index$ $1/ [R=301]

      # L'ultima verifica riguarda slash (/) solo nel caso in cui non è una directory
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_URI} /$
      RewriteRule (.*)/ $1 [R=301]

      Spero ti sia di aiuto,
      a presto.

  • Fabio scrive:

    Buongiorno Ertil, grazie del post!
    Dopo una grossa migrazione ho ancora dei re-indirizzamenti che non riesco a fare tramite htaccess… sono tantissime url che finiscono per: /zona-xxxx/ esempio:
    /zona-bazzano/2/
    /zona-opera/1/feed/page/2/?tipologia=aperto-americanafeed%2Ffeed%2Ffeed/

    Considera che dietro il primo / ci sono gli url corretti ma i motori continuano a scandagliare le miriadi di variabili precedenti inutilmente (da 6 mesi) anche dopo aver indicato il canonical. Come vedi alcuni url sono brevi altre con parametri, vorrei (anche se non è la soluzione migliore) indirizzarli verso un unico url o se possibile (meglio) mantenere la radice prima di /zona-xxx/ che sarebbe poi l’indirizzo canonical.

    Come posso fare? Grazie, Fabio

    • Ertil Gani scrive:

      Ciao Fabio,
      per quale motivo non riesci a indirizzare con htaccess?
      Ti ricordo che il server legge il codice riga per riga e da sopra-sotto, controlla la posizione dove hai inserito il codice per il redirect. Può essere che il server esegue un altra attività prima di arrivare alla tua riga e forse è per questo che non funziona.
      Prova a fare una verifica,

  • Michele scrive:

    Ciao, giusto una dritta. Sto facendo un redirect di alcuni indirizzi che GWMT mi da come 404. Ora ho diverse pagine con tipo: nomedominio.it/pages/123456.html. Come faccio a prendere tutte queste e fare un redirect in home unico? Grazie intanto se vorrai aiutarmi.

    • Ertil Gani scrive:

      Ciao Michele,
      puoi usare una espressione regolare per identificare tutte le URL che ti interessano e poi usare la regola di RewriteRule per il redirect.

      Per esempio, la regola qui sotto trova tutte le url che iniziano con “pages” , continuano con un numero e finiscono con “.html”

      RewriteRule ^pages\/([0-9]+).hmtl$   http://www.nomedominio.it/pagina-desitnazione [L,R=301, NC]

      Ovviamente ti consiglio di fare qualche test per verificare il corretto funzionamento 🙂
      come ho scritto anche nel post è uno strumento molto delicato che si interfaccia con il server e quindi bisogna dare la giusta attenzione.
      Fammi sapere se ti sono stato d’aiuto 🙂
      A presto

  • Luciano scrive:

    Ciao,

    innanzitutto grazie per ciò che fai. Condividere la conoscenza.

    Io ho da tempo un problema con il redirect presso smartphone utilizzando htaccess.

    uso questo codice:
    ## redirect for mobile user agents

    #RewriteCond %{REQUEST_URI} !^/www.miosito.it/.*$
    #RewriteCond %{HTTP_USER_AGENT} “android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile” [NC]
    #RewriteRule ^(.*)$ /http://www.miosito.it?___store=mdefault/ [L,R=302]

    Non funziona. Ho provato anche con altri codici ma niente.
    Come risolvo? Grazie

    • Ertil Gani scrive:

      Ciao Luciano,
      la sintassi del codice per htaccess è molto delicata e basta poco per bloccare tutto.
      Quindi la soluzione che ho in mente per te è quella di effettuare il redirect attraverso due passaggi e riportare la gestione del redirect nel linguaggio che hai usato per creare il sito web.
      Esempio: se il sito è stato sviluppato in php allora crei il file ” miofile.php ” , dove all’interno inserisci la funzione header per il redirect .
      Invece su htaccess reindirizzerai tutti i device mobili verso il nuovo file appena creato nella root:

      RewriteCond %{HTTP_USER_AGENT} "(android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile)" [NC]
      RewriteRule ^$ http://www.sitomio.com/miofile.php [L,R=302]

      Ho già testato lo script per l’htaccess, non dovresti avere problemi.
      Attendo un tuo feedback 🙂
      A presto

    • Ertil Gani scrive:

      Ciao Luciano,
      in tanto grazie per il tuo commento, mi fa piacere esserti di aiuto. 🙂

      Se ho capito bene, tu vuoi indirizzare in una pagina ottimizzata per mobile tutti i smartphone che visitano il tuo sito.
      Il codice che ti scrivo sotto fa proprio a caso tuo:

      <ifModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase / 
      
      RewriteCond %{HTTP_USER_AGENT} "(android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile)" [NC]
      RewriteRule ^$ http://www.sitomio.com/la-mia-url-mobile [L,R=302]
      </ifModule>
      

      Se questo codice non è quello che ti serviva allora prova a descrivere la tua situazione. Lo vediamo insieme 😉
      In ogni caso fammi sapere!
      A presto,
      Ertil

      • Luciano scrive:

        Ciao Ertil,

        grazie ancora per il tuo aiuto.

        Hai capito perfettamente ciò che intendevo dire, ma purtroppo non funziona ancora. Continua ad andare in loop.
        Io però credo che il problema stia nell’url, http://www.miosito.it?___store=mdefault
        Come vedi ho bisogno proprio del codice (?___store=mdefault). Secondo me è il simbolo (=) a dar fastidio ad htaccess.

        Grazie

        • Ertil Gani scrive:

          Ciao Luciano,
          prova ad aggiungere il simbolo slash (/) alla tua url : http://www.miosito.it/?___store=mdefault
          Al 99% dovrebbe funzionare! 🙂
          In caso contrario ho un altra soluzione pronta per te.
          In bocca a lupo 😀

          • Luciano scrive:

            Ciao Ertil,
            niente da fare. Ormai ci sto perdendo la testa oltre che ad un sacco di tempo. 🙁
            A questo punto mi rimetto a te ed alla tua soluzione..
            Grazie ancora del tuo tempo e del tuo aiuto.

            Luciano

Lascia un commento