Skip to content


Attraverso il file .htaccess si possono custimizzare le regole dei webserver Apache abilitando e disabilitando i diversi moduli disponibili.

Uno dei moduli più famosi di Apache, e che oggi vediamo nel dettaglio, è senza dubbio il mod_rewrite ovvero il modulo che ha la funzione di gestire le regole di redirezione e riscrittura degli URL. Il modulo mod_rewrite associa un URL virtuale (non residente sul filesystem) ad un URL reale, tramite delle regole definite nei file .htaccess

Tramite le RegEx (Espressioni Regolari), e comandi specifici del modulo mod_rewrite inserite nel file .htaccess, possiamo definire il comportamento del webserver e personalizzarlo in base alle proprie necessità.

Come si attiva il mod_rewrite

Sulla maggior parte degli hosting condivisi il modulo è già attivo di default. Prima di acquistare un piano d’hosting è sempre meglio informarsi se il modulo è pre-installato e attivato! Se invece il tuo sito è ospitato su un server dedicato,VPS oppure in localhost, molto probabilmente dovrai attivare tu il modulo a mano, ecco come fare:

  • per Apache2: “a2enmod rewrite” come utente root
  • per Apache1 è necessario modificare il file di configurazione e togliere il commento alla linea “LoadModule mod_rewrite”

Apache di default ignora i file .htaccess, per attivare la lettura devi modificare la direttiva AllowOverride all’interno del file di configurazione.

Ricorda di riavviare il webserver per rendere effettive le nuove regole.

Verificare il funzionamento del mod_rewrite

Per controllare se il modulo funziona correttamente crea una pagina .php ed inserisci questa speciale riga di codice:

<!--?php phpinfo(); ?-->

Ora richiamala dal browser la pagina appena creata e cerca nel testo la stringa mod_rewrite sotto Loaded Modules. Se trovi la stringa, vuol dire che il modulo è caricato. Ricorda: caricato in memoria non vuol dire utilizzabile, infatti se il modulo è presente, ma i file .htaccess vengono ignorati (vedi sopra), le regole di riscrittura non funzioneranno! Di seguito trovi alcuni esempi di regole che si possono impostare nel file .htaccess.

Redirezioni con RegEx nel file .HTACCESS

Le RegEx vengono utilizzate all’interno del file .htaccess per definire alcune regole importanti, come ad esempio le redirezioni, per abilitare certe funzioni del web server oppure per bloccare la navigazione a cartelle. Vediamo alcuni esempi utili.

Redirezioni per User Agent

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www.olddomain.com$ [OR]
RewriteCond %{HTTP_HOST} ^olddomain.com$
RewriteCond %{HTTP_USER_AGENT} Googlebot [OR]
RewriteCond %{HTTP_USER_AGENT} msnbot [OR]
RewriteCond %{HTTP_USER_AGENT} Slurp
RewriteRule ^(.*)$ http://bcd.com/$1 [L,R=301]

Spiegazione della regola

  1. Comando per attivare il modulo Apache RewriteEngine
  2. Impostazione del dominio da redirezionare con www
  3. Impostazione del dominio da redirezionare saenza www
  4. Definire user Agent Googlebot
  5. Definire user Agent msnbot
  6. Definire user Agent Slurp
  7. Impostazione dell’URL di destinazione del redirect

Impostare la homepage predefinita

#Specificare una homepage predefinita (index page)
DirectoryIndex home.html

Restringere l’accesso a specifici IP

#Permettere l'accesso soltanto a specifici IP
deny from all
allow from 64.11.219.110
allow from 210.44.45.54

Redirezionare tutte le pagine

#Reindirizzare tutte le pagine di olddomain.com verso newdomain.com
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.olddomain.com$ [OR]
RewriteCond %{HTTP_HOST} ^olddomain.com$
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

Impedire l’accesso alle cartelle

#Prevenire il caricamento di sottocartelle. 
#Questo comando va inserito nel file .htaccess del dominio primario
RewriteCond %{HTTP_HOST} ^primary\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.primary\.com$
RewriteRule ^addon\.com\/?(.*)$ "http\:\/\/www\.addon\.com\/$1" [R=301,L]

Impedire l’accesso ai sotto-domini

#Prevenire il caricamento del sottodominio. 
#Questo comando va inserito nel file .htaccess del dominio primario
RewriteCond %{HTTP_HOST} ^subname\.primary\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.subname\.primary\.com$
RewriteRule ^(.*)$ "http\:\/\/www\.addon\.com\/$1" [R=301,L]

Forzare l’accesso su dominio non-www

#Non inserire mai www nel dominio. 
#Sostituisci 'example.com' con il tuo dominio
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?example\.com)$ [NC]
RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]

Forzare l’accesso su dominio con www

#Inserisci sempre www nel dominio
#Sostituisci 'example.com' con il tuo dominio
RewriteEngine on
RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L]

Impostare la cartella della homepage predefinita

#Impostare la cartella della homepage
#Sostituisci 'folder' con il nome della tua cartella

RewriteEngine On
RewriteRule ^$ /folder/ [R=301,L]

Redirezionare la cartella di accesso

#Rinomina una cartella e forza l'utente al nuovo nome
#Sostituisci 'old' con il nome della vecchia cartella
#Sostituisci 'new' con il nome della nuova cartella
RewriteEngine on
RewriteRule ^/?old([a-z/.]*)$ /new$1 [R=301,L]

Forzare l’accesso sotto HTTPS

#Usare sempre HTTPS per le connessioni sicure
#Sostituisci 'www.example.com' con il tuo dominio così come appare sul certificato HTTPS
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Bloccare il traffico da referrals specifici

#Bloccare il traffico proveniente da certi siti
RewriteEngine on
Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} badsite\.com [NC,OR]
RewriteCond %{HTTP_REFERER} badforum\.com [NC,OR]
RewriteCond %{HTTP_REFERER} badsearchengine\.com [NC]
RewriteRule .* - [F]

Negare l’accesso a certi tipi di file

#Non permettere il caricamento di specifici tipi di file
RewriteEngine on
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|exe|swf)$ - [F,NC]

Rimuovere index dall’URL

Options +FollowSymLinks -MultiViews -indexes
RewriteEngine On
RewriteBase /
#Rimuovere index
RewriteCond %{THE_REQUEST} /index(\.php)?[\s?/] [NC]
RewriteRule ^(.*?)index(/|$) /$1 [L,R=301,NC,NE]

Rimuovere .php dall’URL

Options +FollowSymLinks -MultiViews -indexes
RewriteEngine On
RewriteBase /
#Rimuovere .php; usare THE_REQUEST per prevenire loop infiniti
RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
RewriteRule (.*)\.php$ $1 [L,R=301]

Rimuovere index e / dall’URL

Options +FollowSymLinks -MultiViews -indexes
RewriteEngine On
RewriteBase /
#Rimuovere index
RewriteRule (.*)/index$ $1/ [R=302]
#Rimuovere lo slash / se non è una directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /$
RewriteRule (.*)/ $1 [R=301,L]

Aggiungere .php all’URL per accedere files senza redirezioni

Options +FollowSymLinks -MultiViews -indexes
RewriteEngine On
RewriteBase /
#Aggiungere .php per accedere al file, senza essere redirezionato
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1.php [L]

Redirezionare tutte le richieste al dominio con ‘www’

RewriteEngine on

# Redirect to domain with www.
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Same for HTTPS:
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Redirezionare tutte le richieste al dominio senza ‘www’

RewriteEngine on

# Redirect to domain without www.
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule .* http://%1%{REQUEST_URI} [R=301,L]
# Same for HTTPS:
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule .* https://%1%{REQUEST_URI} [R=301,L]

Redirezioni di massa verso un altro dominio

RewriteEngine on

# Redirect to another domain: www.sitodidestinazione.it.
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^(www\.)?sitodidestinazione\.it$ [NC]
RewriteRule .* http://www.sitodidestinazione.it%{REQUEST_URI} [R=301,L]
# Same for HTTPS:
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^(www\.)?sitodidestinazione\.it$ [NC]
RewriteRule .* https://www.sitodidestinazione.it%{REQUEST_URI} [R=301,L]

Aggiungere lo slash “/” alla fine di tutti gli URL

RewriteEngine on

# Ensure all directory URLs have a trailing slash.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}/ [L,R=301]
# Same for HTTPS:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI}/ [L,R=301]

Redirezione definitiva

# 301 Redirect URLs.
Redirect 301 /www.urlprima.it /www.urldopo.it

Stop Hotlinking

RewriteEngine on

# Stop hotlinking.
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} ^https?://([^/]+)/ [NC]
RewriteCond %1#%{HTTP_HOST} !^(.+)#\1$
RewriteRule \.(jpg|jpeg|png|gif|swf|svg)$ - [NC,F,L]

Abilitare il Caching

# Add Caching.
<FilesMatch ".(ico|jpg|jpeg|png|gif|js|css|swf)$">
    Header set Cache-Control "max-age=3600"
</FilesMatch>

Bloccare la navigazione a cartelle

# Prevent directory listings
Options All -Indexes

Abilitare la compressione di file HTML, CSS, JavaScript e XML

# Compress text, html, javascript, css, xml:
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
## From permalink "Day and Name (/%year%/%monthnum%/%day%/%postname%/)" to "postname"
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)$ http://www.yourwebsite.com/$4

## From permalink "Month and Name (/%year%/%monthnum%/%postname%/)" to "postname"
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/(.*)$ http://www.yourwebsite.com/$3

## From permalink "Numeric (/archives/%post_id%)" to "postname"
RedirectMatch 301 ^/archives/(\d+)$ http://www.yourwebsite.com/?p=$1

Articoli correlati

Autore

Commenti |42

Lascia un commento Lascia un commento
  1. Paolo 3 commenti

    Buongiorno, ho letto questo interessante articolo ma purtroppo non ho trovato quello che mi occorre. Provo a chiederti specificatamente.
    Dato un sito che genera url duplicate in questa maniera:
    www. sito .xx /pagina
    www. sito .xx/pagina.html

    C’è un’istruzione da scrivere sul file .htaccess che dica al cms di redirezionare tutte le url senza html alla versione con l’html? Sennò mi tocca farle una per una…

    Grazie in anticipo per l’attenzione.

    1. Giovanni Sacheli 752 risposte

      Buongiorno Paolo, più che un redirect credo le serva un URL-rewrite, ovvero un comando che appenda “.html” a tutte le pagine di WordPress. Per questo fine ci sono molte strade:

      • è possibile usare un plugin (https://srd.wordpress.org/plugins/html-in-url/ oppure https://wordpress.org/plugins/append-extensions-on-pages/)
      • A manina: (Settings >> Permalinks >> Custom Structure) utilizzando come permalink, ad esempio /%category%/%postname%.html
      • oppure con qualcosa del genere nel tuo .HTACCESS:

        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !\..+$
        RewriteRule ^(.*)$ /$1.html [R=301,L]

      Credo che il sistema via permalink sia il più indicato. Fammi sapere su hai risolto :) Buon lavoro.

  2. Daniela Fabris 1 commento

    Buongiorno!
    Grazie dell’articolo: devo dire che è ben fatto e spiega in modo molto,pratico gli accorgimenti da tenere in considerazione. Ho però un problema con un sito costruito in Silverstripe il cui file .htaccess sembra negare l’accesso a tutte le sotto cartelle non riconoscendo l’eventuale index.php. Infatti ho installato in una cartella secondaria WordPress ma, dopo averla installato e configurato il tutto non mi permette di accedere al backend generando errore 403.
    Il file .htaccess ha una serie di deny all e vorrei che rimanesse tale ad eccezione della cartella di installazione di wordpress.
    Come posso scrivere?
    Vi ringrazio fin d’ora
    Daniela

    1. Giovanni Sacheli 752 risposte

      Ciao Daniela, prova con la direttiva FilesMatch

      <FilesMatch "^wordpress\.php$">
      Allow From All
      </FilesMatch>

      Fammi sapere :) a presto!

  3. Anna 2 commenti

    Buona sera,
    Grazie per l’articolo molto chiaro! Se posso vorrei domandarle: se io dovessi inserire una cartella nel percorso? Sto riscrivendo il mio sito e ho deciso di aggiungere una sottocartella “blog”. Però, per evitare di perdere i collegamenti condivisi negli ultimi anni vorrei modificare il file htaccess dando le istruzioni necessarie per far questo.. Purtroppo continuo a sbagliare qualcosa nella modifica..

    potrei fare o da “esempio.org/aaaa/mm/dd/filename” a “esempio.org/blog/aaaa/mm/dd/filename”
    oppure, “esempio.org/aaaa/mm/dd/filename” a “esempio.org/blog/filename”

    Grazie mille sin da ora,
    Anna

    1. Giovanni Sacheli 752 risposte

      Ciao Anna, per sostituire una cartella la base è questa:
      RedirectMatch 301 /aaaa(.*) /blog/$1

      Ti consiglio di giocare con questo tool gratuito oppure questo che ti consiglia le regole che vorresti implementare impostando le cartelle vecchie e quelle nuove.

      1. Anna 2 commenti

        Grazie mille! Gentilissimo!

  4. Mirco 2 commenti

    Complimenti ben dettagliato.
    Avrei un richiesta, se possibile , devo fare un captive-portal e quindi avrei bisogno di una serie di istruzioni per rindirizzare, ad un percorso statico (www.ilmiosito.it), qualsiasi cosa un cliente possa scrivere nella barra degli indirizzi.
    C’è possibilità di fare questo?

    Grazie
    Mirco

    1. Giovanni Sacheli 752 risposte

      Ciao Mirco, redirezionare tutto alla home non è mai una pratica consigliata. Rischi di redirezionare anche link nocivi nel caso ce ne fossero. Lo status code 404 esiste per un motivo dopo tutto :)

      In ogni caso la regola è questa:


      RewriteEngine on
      RewriteRule ^(.*)$ http://www.esempio.it/$1 [R=permanent,L]

      1. Mirco 2 commenti

        Grazie … molto gentile!

  5. ennio 3 commenti

    Perche il file .htaccess presente in una sotto cartella di wordpress (ad es. nel theme-child) non sovrascrive le direttive presenti nel file .htaccess della cartella superiore?

    Desidero creare qusto file htacces nel theme-child in quanto temo che il successivo aggiornamento del tema di wp vada a sovrascrivere il file.

    1. Giovanni Sacheli 752 risposte

      Buongiorno Ennio, il file .htaccess lavora a livello di singola cartella, in questo modo Apache può ricevere direttive specifiche per ciascuna cartella.
      Volendo potrebbe esserci un file .htaccess per cartella in modo da customizzare le regole per ciascun contenitore.
      La gerarchia parte dall’htaccess nella cartella superiore, poi inserendo altri htaccess in una cartella inferiore sovrascrive le direttive, ma solo per la cartella inferiore. Funziona cosi.
      Buon lavoro.

  6. Loretta 4 commenti

    Ciao Giovanni, grazie per la guida, è utilissima!
    Ho un problema con l’htaccess di un sito in wordpress. In sostanza dovrei ridirezionare tutte le vecchie URL del sito precedente, che sono in .php, ma ogni istruzione che inserisco viene bellamente ignorata. Se invece inserisco istruzioni da ipotetiche pagine .html oppure da URL senza estensioni, il tutto funziona.
    Nello specifico dovrei redirezionare pagine come

    www.dominio.com/contatti.php a www.dominio.com/contatti/

    ed ho provato in vari modi (301, RewriteRule e RedirectMatch) che non funzionano da /contatti.php ed invece funzionano normalmente se sostituisco .php con .html.
    Può essere lo snippet di wordpress che ostacola? O dei blocchi a monte?

    Grazie del tuo tempo!!

    1. Giovanni Sacheli 752 risposte

      Ciao Loretta grazie per il commento.
      Hai provato con questa regola

      # Permanent URL redirect
      Redirect 301 /contatti.php http://www.dominio.com/contatti/

      ?

      1. Loretta 4 commenti

        Ciao Giovanni, grazie per la risposta.
        Sì sì, regola provata, ma non funziona.. è come se l’htaccess funzionasse in maniera selettiva. Potrebbe essere qualcosa nelle impostazioni di hosting?
        Mi sono anche accorta che nelle url in .php non funziona il redirect da non-www a www. Cosa che invece funziona per le url del nuovo sito in WP.

        1. Giovanni Sacheli 752 risposte

          Loretta è molto difficile fare una diagnosi ad occhi chiusi :| si possono solo fare supposizioni.
          La regola formalmente è corretta e dovrebbe andare, se non funziona – o l’hosting non accetta modifiche al file htaccess, oppure hai altri plugin/script che hanno precedenza, o non saprei.
          Magari hai un server Nginx che non usa htaccess? Sei in hosting condiviso o VPS?

          Dovrei metterci mano :)

          1. Loretta 4 commenti

            Ciao Giovanni, ho chiesto a chi si occupa dell’hosting: l’htaccess accetta le modifiche e non ci sono altri plugin che lo gestiscono.
            Il server non usa Nginx ma PHP FPM. Poi mi scrivono che il servizio non ha una vps dedicata ma un hosting condiviso con processi dedicati.

            Scrivono anche che a livello superiore c’è inserita questa istruzione:

            RewriteCond %{HTTPS} !=on
            RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

            Potrebbe influire secondo te?

            1. Giovanni Sacheli 752 risposte

              Ciao Loretta, sono due regole che possono andare in contrasto.
              La regola che hai usato tu rimanda a http://www.dominio.com/contatti/ e questa redireziona ad HTTPS tutti gli URL.

              Prova ad usare anche tu HTTPS nella destinazione finale:

              # Permanent URL redirect
              Redirect 301 /contatti.php https://www.dominio.com/contatti/

              1. Loretta 4 commenti

                Ciao Giovanni,
                sì scusa, in realtà la regola ha sempre rimandato ad https, errore mio che non sono stata attenta nel primo commento.
                Intanto mi hanno appena risposto che l’htaccess non funzionava a causa del fatto che usiamo Apache2 + FPM ed FPM intercetta tutte le pagine .php prima di qualsiasi cosa. Abbiamo modificato la configurazione rendendo ora manipolabili le pagine php con il rewrite dal file .htaccess.

                Risolto! Grazie comunque Giovanni per la tua assistenza!

                1. Giovanni Sacheli 752 risposte

                  Grazie Loretta per aver condiviso la soluzione :)

  7. marco 17 commenti

    Ciao Giovanni, sempre molto utili i tuoi articoli.
    Nel mio caso, che non ho trovato esempi sopra, dovrei fare redirect 301 di tutta la sezione /news/ con i post interni verso la homepage delle versioni linguistiche.
    Ad esempio:
    https://www.miosito.com/en/news 301 https://www.miosito.com/en/
    https://www.miosito.com/it/news 301 https://www.miosito.com/it/
    https://www.miosito.com/fr/news 301 https://www.miosito.com/fr/
    https://www.miosito.com/de/news 301 https://www.miosito.com/de/

    Ovviamente per ogni categoria di /news all’interno ci sono qualche centinaia di articoli.
    Penso si debba usare qualche espressione regolare, ma non so come farlo.

    Potrebbero andare bene delle regole cosi:

    Options +FollowSymLinks
    RewriteEngine on
    Redirect 301 /en/*news* https://www.miosito.com/en/
    Redirect 301 /it/*news* https://www.miosito.com/it/
    Redirect 301 /fr/*news* https://www.miosito.com/fr/
    Redirect 301 /de/*news* https://www.miosito.com/de/

    E nel caso in cui volessi fare i 301 solamente di quello che sta dopo/successivo in una cartella e reindirizzarlo verso la cartella stessa, ad esempio:
    https://www.miosito.com/it/realizzazioni/inside-out
    su
    https://www.miosito.com/it/realizzazioni/
    la regola potrebbe essere:

    Redirect 301 /it/realizzazzioni/* https://www.miosito.com/it/

    Grazie mille

    1. Giovanni Sacheli 752 risposte

      Ciao Marco, immagino tu stia usando apache/htaccess.
      Hai provato con qualcosa del genere?

      Options +FollowSymLinks
      RewriteEngine On
      RewriteRule ^en/news/(.*)$ /en/$1 [R=301,NC,L]

      1. marco 17 commenti

        Grazie Giovanni :) Funziona .

        Non Funziona però
        https://www.miosito.com/it/realizzazioni/inside-out
        su
        https://www.miosito.com/it/realizzazioni/

        Redirect 301 /it/realizzazzioni/* https://www.miosito.com/it/

        Ti ringrazio Moltissimo

        1. Giovanni Sacheli 752 risposte

          Ciao Marco, felice che funzioni.
          Per gli altri pattern devi modificare la regola, ad esempio:

          Options +FollowSymLinks
          RewriteEngine On
          RewriteRule ^it/realizzazioni/(.*)$ /it/$1 [R=301,NC,L]

          1. marco 17 commenti

            Ciao Giovanni. Scusa per il ritardo e grazie
            Con questa regola non stai forzando affinchè tutti i files che si trovano dopo /realizzazioni/ vengano reindirizzati verso /it/ ?
            Vorrei che invece che le pagine dopo /realizzazioni/ vengano reindirizzate verso la stessa…cosa mi sfugge?
            Grazie ancora

            1. Giovanni Sacheli 752 risposte

              Ciao Marco,
              scusa ma non capisco la domanda.
              Nel tuo esempio hai messo
              /it/realizzazioni/esempio.it
              Dove vuoi mandare esempio.it?

              Se vuoi redirezionare tutta la cartella alla index della cartella, la regola è tipo:

              Redirect 301 /realizzazioni/(.*)$ /realizzazioni/

              Oppure

              RewriteRule ^it/realizzazioni/(.*)$ /it/realizzazioni [R=301,NC,L]

              1. marco 17 commenti

                Grazie Giovanni , ad esempio:
                https://www.miosito.com/it/realizzazioni/inside-out
                https://www.miosito.com/it/realizzazioni/inside-dx
                https://www.miosito.com/it/realizzazioni/inside-sx
                https://www.miosito.com/it/realizzazioni/inside-in
                tutte queste url devono fare redirect 301
                su
                https://www.miosito.com/it/realizzazioni/
                Quindi cartella madre

                1. Giovanni Sacheli 752 risposte

                  Ciao Marco, le due regole mostrate nel commento precedente non vanno bene?

                  1. marco 17 commenti

                    Ciao Giovanni, perdonami il ritardo… Hai ragione la regola precedente va bene :)

                    Ultima cosa se posso:
                    Mi sono accorto che delle pagine del sito sono raggiungibili senza / finale.
                    Vorrei “forzarle” tutte con lo / finale senza fare i 301 su ognuna.
                    Esiste una regola su htaccess ?

                    Grazie

                    1. Giovanni Sacheli 752 risposte

                      Ciao Marco, per aggiungere il Trailing Slash al file .htaccess puoi usare una regola di Rewrite, come ad esempio

                      RewriteCond %{REQUEST_URI} !(/$|\.)
                      RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

                      Questo codice deve essere messo all’inizio del tuo file .htaccess e sotto “RewriteEngine On”

      2. marco 17 commenti

        Ciao Giovanni. Testando in ambiente di staging andava bene , ora non più :(

        Ho immesso questo nel file .htaccess

        RewriteEngine On
        RewriteRule ^en/news/(.*)$ /en/$1 [R=301,NC,L]
        RewriteRule ^it/news/(.*)$ /it/$1 [R=301,NC,L]
        RewriteRule ^fr/news/(.*)$ /fr/$1 [R=301,NC,L]
        RewriteRule ^de/news/(.*)$ /de/$1 [R=301,NC,L]

        Praticamente verifico qualche url e non mi rimanda alla home linguistica, ma alla url di partenza senza la sezione/news/

        Ad esempio:
        https://www.miodominio.com/it/news/museo-bailo
        non mi rimanda a https://www.miodominio.com/it/
        ma bensi’ a https://www.miodomidnio.com/it/museo-bailo

        Praticamente mi leva la cartella /news/ e ovviamente con errore 404 non esistendo la pagina, lasciando la parte successiva alla sezione/news/, essa come tutti gli altri post devono andare su https://www.seccosistemi.com/it/

        Grazie mille

        1. Giovanni Sacheli 752 risposte

          Ciao, prova togliendo $1 dalle regole.

          1. marco 17 commenti

            Grande Giovanni: Funziona !

            Grazie Mille Ancora

  8. Francesco 1 commento

    Ciao Giovanni,
    complimenti per l’articolo, ho un sito in cui l’url dei progetti è:
    – nomesito.it/pag_portfolio.php?id=20
    lo vorrei far diventare
    – nomesito/portfolio?nome_progetto=nome progetto

    Sul file .htaccess ho scritto le seguenti regole:


    RewriteEngine On
    RewriteRule ^pag_portfolio.php?id=([0-9]+) portfolio?nome_progetto=$1

    Non succede nulla puoi aiutarmi a capire cosa sbaglio.
    PS: ho fatto la prova a creare la pagina PHP con il comando phpinfo, l’ho caricata ma non trovo ne “mod_rewrite” ne “Loaded Modules”.

    1. Giovanni Sacheli 752 risposte

      Ciao Francesco, se non hai alcun modulo PHP per la gestione delle regole di rewrite non possono funzionare i relativi comandi.
      Prova a verificare se da cPanel puoi attivarli o richiedili al tuo hosting provider.

  9. Elena 1 commento

    Buongiorno,
    Grazie per il tutorial spiegato benissimo, davvero complimenti, non riesco a trovare mai nulla di chiaro sull’htaccess. Mi manca però il mio caso.
    Come posso far funzionare questa regola se il mio sito è dentro una sottocartella?
    RewriteRule ^cookie/$ . /cookie.php [L]
    Inoltre mi sembra che manchi ancora qualcosa? Puoi dirmi se c’è un errore?
    Dovrebbe essere
    https://miodominio.it/sottocartella/cookie/

    Grazie

  10. Antonio 1 commento

    Ciao Giovanni, grazie per l’articolo.
    Non riesco però a creare una regola che mi elimina la parte finale dell’ url.

    Io uso Joomla e ho un componente che mi genera un duplicato di tutte le pagine del stio inserendo alla parte finale dell’ URL una stringa ?rCH=2
    Come posso eliminare questa stringa lasciando intatto il resto dell’ URL?

    è possibile?
    grazie
    Tony

    1. Giovanni Sacheli 752 risposte

      Ciao Antonio, potresti dare un occhio a questa pagina.
      Ci sono esempi di regole HTACCESS per riscrivere gli URL senza determinati parametri.

      Ad esempio:

      RewriteEngine on
      RewriteCond %{REQUEST_FILENAME} -f
      RewriteCond %{QUERY_STRING} ^(.*)&?query=[^&]+&?(.*)$ [NC]
      RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L,NE]

  11. Marco 1 commento

    Buongiorno Giovanni e complimenti.

    Non sono un esperto in materia redirect, dopo aver rifatto un sito cambiando la piattaforma, mi trovo a dover reindirizzare vecchi url sui nuovi.

    Nel link sottostanti si nota come ho voluto modificare da ‘blog’ ad ‘articoli’ e a seguire ho voluto modificato anche i nomi degli articoli.
    Sottolineo l’attenzione su quel simpatico ‘?’ presente nell’url, credo che sia un/il problema…

    es. vecchio url: www.miosito.it/blog/?lo-zafferano–proprieta-e-benefici
    es. nuovo url: www.miosito.it/articoli/proprieta-dello-zafferano

    Sto utilizzando la stringa:
    Redirect 301 /blog/?lo-zafferano–proprieta-e-benefici
    https://www.miosito.it/articoli/proprieta-dello-zafferano

    Puoi aiutarmi PER FAVORE ?

    1. Giovanni Sacheli 752 risposte

      Buongiorno Marco e grazie per i complimenti!
      Per gestire il redirect di un URL con parametri (come il ‘?’ nel tuo caso), ti consiglio di utilizzare il modulo mod_rewrite di Apache piuttosto che la direttiva Redirect. mod_rewrite è più flessibile e ti consente di gestire situazioni complesse come questa.
      Per prima cosa, assicurati che il modulo mod_rewrite sia abilitato sul tuo server. Se stai utilizzando un hosting condiviso, è probabile che sia già abilitato. In caso contrario, potresti dover contattare il tuo fornitore di hosting per chiedere l’attivazione.

      Una volta confermato che il modulo è abilitato, apri il tuo file .htaccess e aggiungi le seguenti righe:

      RewriteEngine On
      RewriteBase /
      RewriteCond %{QUERY_STRING} ^lo-zafferano–proprieta-e-benefici$
      RewriteRule ^blog/$ https://www.miosito.it/articoli/proprieta-dello-zafferano? [R=301,L]

      Questa regola fa quanto segue:

      1. RewriteEngine On attiva il motore di riscrittura, mentre RewriteBase / imposta la base del percorso di riscrittura.
      2. RewriteCond %{QUERY_STRING} controlla la stringa di query dell’URL, ovvero la parte dopo il ‘?’.
      3. ^lo-zafferano–proprieta-e-benefici$ è un’espressione regolare che corrisponde alla stringa di query desiderata.
      4. RewriteRule ^blog/$ è la regola effettiva che controlla se la richiesta inizia con ‘blog/’.
      5. https://www.miosito.it/articoli/proprieta-dello-zafferano? è l’URL di destinazione del redirect.
      6. [R=301,L] indica che si tratta di un redirect permanente (301) e che questa è l’ultima regola da elaborare (L sta per ‘Last’).

      Dopo aver aggiunto queste righe al tuo file .htaccess, salva e carica il file sul tuo server. Dovresti ora vedere che la vecchia URL viene reindirizzata correttamente alla nuova URL.
      In bocca al lupo!

  12. marco 17 commenti

    Ciao Giovanni.
    Sei sempre la mia ancora di salvezza per i redirects :) spero di non abusare della tua pazienza…

    Devo fare dei redirect di un vecchio blog che al posto dei post , ha un pezzo degli estratti normali ed il restante articolo in pdf.

    Questi pdf sono indicizzati e sono 180 circa.

    Ora il nuovo sito riporterà i testi all’interno dei pdf sottoforma di post normali; dovrei dunque fare i redirects tramite htaccess .

    In questo caso la sintassi corretta potrebbe essere :

    RewriteEngine On
    RewriteBase /
    Redirect 301 it/wp-content/uploads/2023/05/CV_272.pdf https://nuovosito.com/articolo-corrispondente
    Redirect 301 it/wp-content/uploads/2023/05/CV_273.pdf https://nuovosito.com/articolo-corrispondente-1

    E’ corretta? Sempre su Apache…

    Grazie mille

    1. Giovanni Sacheli 752 risposte

      Ciao Marco, nessun problema, sono felice di poterti aiutare!

      La tua sintassi è quasi corretta. Invece di mescolare la direttiva “Redirect” con “RewriteEngine” e “RewriteBase” (che sono parte del modulo mod_rewrite), sarebbe meglio utilizzare o una o l’altra.

      Se desideri utilizzare la direttiva “Redirect”, potresti fare così:


      Redirect 301 /it/wp-content/uploads/2023/05/CV_272.pdf https://nuovosito.com/articolo-corrispondente
      Redirect 301 /it/wp-content/uploads/2023/05/CV_273.pdf https://nuovosito.com/articolo-corrispondente-1
      ...

      Altrimenti, se preferisci utilizzare mod_rewrite, la tua sintassi dovrebbe essere qualcosa del genere:


      RewriteEngine On
      RewriteBase /
      RewriteRule ^it/wp-content/uploads/2023/05/CV_272.pdf$ https://nuovosito.com/articolo-corrispondente [R=301,L]
      RewriteRule ^it/wp-content/uploads/2023/05/CV_273.pdf$ https://nuovosito.com/articolo-corrispondente-1 [R=301,L]
      ...

      Ricorda di sostituire “https://nuovosito.com/articolo-corrispondente” e “https://nuovosito.com/articolo-corrispondente-1” con i veri URL dei tuoi nuovi articoli.
      In entrambi i casi, dopo aver aggiornato il tuo file .htaccess, salvalo e caricalo sul tuo server. Assicurati di testare il tutto per verificare che i redirect funzionino come previsto.

      Buona fortuna!

Lascia un commento

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

Ultimi articoli aggiornati

Richiedi un preventivo SEO e Google Ads

Porta il tuo sito web al livello successivo con l’expertise di EVE Milano. La nostra agenzia di Search Marketing ha ricevuto oltre 1121 richieste di preventivo, un segnale chiaro della fiducia che imprenditori e manager, come te, ripongono nella nostra specializzazione tecnica e verticale nella SEO e PPC. Se la tua organizzazione cerca competenze specifiche per emergere nei risultati di Google, noi siamo pronti a fornire quel valore aggiunto. Affidati alla nostra esperienza per fare la differenza.
Richiedi un preventivo

Vuoi rimanere aggiornato su tutte le novità SEO e Google Ads?

Iscriviti alla nostra newsletter!

Informativa sui cookies

Noi e terze parti selezionate utilizziamo cookie o tecnologie simili per finalità tecniche e, con il tuo consenso, anche per le finalità di esperienza e misurazione come specificato nella cookie policy. Puoi liberamente prestare, rifiutare o revocare il tuo consenso, in qualsiasi momento, accedendo al pannello delle preferenze. Il rifiuto del consenso può rendere non disponibili le relative funzioni. Usa il pulsante “Accetta” per acconsentire. Usa il pulsante “Rifiuta” per continuare senza accettare.