Guida file htaccess: mod-rewrite e redirect 404

Oggi scopriamo a cosa serve e come redigere un buon file htaccess per i nostri progetti di web design. Per chi non lo sapesse l’htaccess è un piccolo file creato per molti scopi, come ad esempio la ri-scrittura dei link per renderli più appetibili ai motori di ricerca.

Questo tipo di file deve essere scritto come un normale file di testo .txt (usate il blocco note), per renderlo “operativo” uno volta uploadato nella root del nostro server dovrete rinominarlo da htaccess.txt in .htaccess, questo passaggio è molto importante dato che determina il corretto funzionamento dello stesso.

Vediamo ora i vari usi di questo file.

Redirect a una pagina nel caso di errore 404

Durante la creazione e amministrazione di un sito web si deve sempre tenere conto di “intoppi” o successivi cambiamenti. Nel caso di siti complessi è buona norma creare una pagina speciale chiamata “404”, ovvero una pagina web ultra-ottimizzata per i motori di ricerca che si visualizzi nel caso un ignaro visitatore incappasse in un articolo non più esistente o rinominato. Senza questo tipo di pagina il visitatore si troverebbe di fronte alla pagina standard del server, molto spoglia, che lo farebbe letteralmente fuggire del nostro sito. Con una pagina 404 invece, possiamo:

– predisporre un motore di ricerca dei contenuti, il visitatore non trovando più quello cercato, potrebbe voler cercare ugualmente nel nostro sito.

– reperire dal database articoli “simili” a quelli cercati dal visitatore, o in alternativa, visualizzare gli articoli “HOT” del sito per incuriosire il visitatore.

– Nella pagina 404 è buona norma spiegare cos’è successo, non tutti sono internauti provetti, pertanto scrivete frasi d’effetto del tipo: “OPS quello che stai cercando è stato cancellato o spostato, prova  a cercare all’interno del sito!”

– Per approfondire vi rimando a questo mio vecchio articolo dove si svela tra l’altro come creare pagine 404 per i più noti CMS (Joomla e WP).

Ritornando al file htaccess, per effettuare il redirect alla vostra pagina 404.php scrivete sul blocco note quanto segue:

ErrorDocument 404 /404.php

salvate e uppate sul vostro server (root del sito mi raccomando!) e rinominate poi il file in .htaccess , ora andate sul vostro sito e scrivete www.tuosito/ciao a questo punto se avete creato correttamente anche la pagina 404.php il server dovrebbe reindirizzarvi in automatico. 

NOTA BENE: non effettuate il redirect alla home page del sito, oltre ad essere scorretto, è buona norma usare una pagina 404 creata ad “hoc” per queste evenienze. Ricordate di ottimizzarla anche lato SEO per ridurre al minimo il rischio di penalizzazioni.

NOTA2: Se usi un qualsiasi CMS nel tuo htaccess vedrai già scritta questa regola quindi non aggiungerla ulteriormente!

Usare una (o più) home page

Un altro uso molto utile  di htaccess è dare la possibilità allo sviluppatore di creare delle homepage “secondarie” nel caso la prima non sia raggiungibile per diversi problemi, o sia offline per manutenzione. Ecco la regola:

DirectoryIndex index.php indexoffline.php

Come vedete se il file index.php non è raggiungibile viene effettuato un redirect su indexoffline.php , che può essere ad esempio una pagina di manutenzione del tipo: “ritorneremo online a breve”. Potete impostare quante pagine volete, il server andrà a oltranza (seguendo ovviamente l’rodine fornito dalla regola)  finchè non trova una pagina web raggiungibile da usare come home page.

I vantaggi? bhè se ad esempio volete modificare il sito e metterlo offline vi basterà rinominare index.php in index2.php e automaticamente il server userà come home page la vostra seconda pagina, nel nostro caso di esempio, indexoffline.php.

Questa regola può essere utilissima in WordPress dato che il noto CMS (per ora) non possiede la modalità manutenzione.

Scrivere i permalink, introduzione al mod rewrite.

I CMS integrano già questa regola, ovvero nel caso lo attiviate, riscrivono dinamicamente gli url (indirizzi) delle vostre pagine web. A cosa serve? bhè sappiate che questa è forse la funzione più importante del file htaccess perchè vi permette con il minimo sforzo di salire nelle SERP e di far posizionare meglio il vostro sito. Di fatto il file con le regole rewrite, “riscrive” letterlamente gli ugly url del tipo:

www.tuosito.it/singolo.php?cat=trilocali&titolo=villa-sul-mare

www.tuosito.it/trilocali/villa-sul-mare.html

Come vedete per i motori di ricerca il secondo tipo di url è molto più ottimizzato dato che elimina le parti “superflue” del link, che ci sono servite in fase di programmazione ma che ora danno solo fastidio.

Questo tipo di regole non sono per niente facili, e richiedono basi php, eccone un esempio:

RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)\.html$ /singolo.php?cat=$1&titolo=$2 [L]

Come vedete, inizio dichiarando che inizio la fase di rewrite, dopodichè imposto:

Link finale con estensione .html

– voglio riscrivere l’ugly url che contiente una variabile cat e una variabile titolo (link a due variabili). 

-Con [L] chiudo la scrittura (risparmia risorse sul server).

In questo esempio quando il server incontra un ugly url  due variabili di quel tipo riscrive automaticamente il link eliminando le parti inutili. Ricordo che tutti i CMS hanno già questa funzione pronta da usare (vedi i permalink di WP e Joomla), dovrete ricorrere alla “scrittura manuale” del file htaccess solo nel caso vogliate ideare un vostro cms o progetto web in php.

Una curiosità esclusiva…

Quando si è alle prime armi non si sanno molti trucchi e molte volte il lavoro può essere vanificato. Ebbene se seguite questa guida alla lettera creando un vostro CMS probabilmente il rewrite mode non funzionerà dandovi errore. Che cos’è successo? la risposta è semplice, non basta impostare le regole via htaccess ma, nel caso programmiate il cms in php dovrete anche modificare i link all’interno del sito impostati in fase di programmazione. All’interno del sito infatti dovrete cambiare da :

http://www.tuosito.it/singolo.php?cat=$cat_articolo&titolo=$titolo_articolo

http://www.tuosito.it/$cat_articolo/$titolo.html

Ovviamente esistono tricks un pò più avanzati per ovviare a tale problema (tipo impostare la rewrite base) però questa vuole essere una guida di base e non avanzata pertanto mi limito qui.

Compressione e gestione della cache

Uno degli strumenti forniti da htaccess è anche quello della gestione della cache. Ecco un esempio di compressione tramite zlib (se il vostro server lo supporta):

#Etag
FileETag None

# compressione zlib
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
<FilesMatch "\\.(js|css|html|htm|php|xml)$">
SetOutputFilter DEFLATE
</FilesMatch>

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript application/x-httpd-php application/rss+xml application/atom_xml
</IfModule>

<ifmodule mod_php5.c>
 php_value zlib.output_compression 16386
</ifmodule>

#abilitazione cache
<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 seconds"
  ExpiresByType text/html "access plus 1 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 604800 seconds"
  ExpiresByType text/javascript "access plus 216000 seconds"
  ExpiresByType application/x-javascript "access plus 216000 seconds"
</ifModule>

<IfModule mod_headers.c>
ExpiresActive On
ExpiresDefault A0

# 1 YEAR
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>

# 1 WEEK
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A604800
</FilesMatch>

# 3 HOUR
<FilesMatch "\.(txt|xml|js|css)$">
ExpiresDefault A10800
</FilesMatch>
</IfModule>

Vedi i commenti per maggiori informazioni =D

Risorse e materiale

Come sempre ecco qualche link utile per approfondire l’argomento:

DOCUMENTAZIONE UFFICIALE APACHE

-GUIDA MOLTO BEN FATTA SUL MOD REWRITE BY ANTONIO FULLONE

– CREA IL TUO FILE HTACCESS ONLINE

Spero vi sia di aiuto ^^ Condividete e commentate =D

Lascia la tua opinione

17 comments

  • Ciao, non so se la domanda che sto per fare è pertinente al tema corrente ma ci provo lo stesso.

    Tramite mod rewrite posso non mostrare il nome delle pagine e le loro estensione in una determinata cartella.

    es http://www.miosito.it/pippo/index.php oppore http://www.miosito.it/pippo/pagina.php
    cambiati in
    http://www.miosito.it/pippo/

  • Ciao Mark il campo del mod rewrite è molto vasto e complesso onestamente non so rispondere alla tua domanda, molto probabilmente si può fare tranquillamente usando qualche proprietà nel rewrite. Prova a visitare la doc ufficiale =)

  • Ciao riccardo, sono interessato come Mark116 a modificare l’indirizzo visibile delle mie pagine.

    Ho visto che anche tu, nel sito, fai la stessa cosa. Potresti inserire qualche esempio?

  • a che sito ti riferisci Giorgio? targetweb o qualche altro mio progetto/lavoro?

  • Mi riferivo a targetweb ma ora che ci penso forse tu non hai fatto quello che voglio fare io.

    • Ciao, ho capito di cosa parlano alcuni utenti.
      Molte persone si stanno chiedendo come si fa a trasformare un link da (es: http://www.miosito.com/pagina1.html A http://www.miosito.com/pagina1)
      è semplice in realtà:
      nel vostro htaccess (se non ne avete uno lo create) scrivete (sotto quello che c’è scritto se lo avete già) questo:
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^([^\.]+)$ $1.html [NC,L]

      ATTENZIONE CHE SE AVETE GIA’ LA PRIMA RIGA DA ME CITATA NEL HTACCESS NON DOVETE RISCRIVERLA, QUINDI:

      il vostro codice ha RewriteEngine On in una qualsiasi linea non la riscrivete in modo da scrivere solo
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^([^\.]+)$ $1.html [NC,L]

      spero di essere stato chiaro a tutti.

      • Ciao Tom,
        grazie per il chiarimento, in effetti è proprio quello che sto cercando di fare, avendo trasferito un sito da Joomla a WordPress.
        In realtà sono riuscito ad ottenere l’effetto desiderato, con un codice diverso trovato su un altro forum: il problema è che sovrascrive anche i redirect personalizzati.Il codice che ho usato è questo:

        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ – [L]
        RewriteCond %{REQUEST_URI} \.html$
        RewriteRule ^(.*)\.html$ $1 [R=301,L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]

        Ho modificato come da tuo esempio in

        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ – [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
        RewriteRule ^([^\.]+)$ $1.html [NC,L]

        Funziona, ma anche così il rewrite che elimina .html è la regola primaria che sovrascrive tutti gli altri redirect impostati manualmente.
        Qualche suggerimento? Purtroppo la mia esperienza con questo linguaggio non mi permette di più del copia/incolla
        Grazie

  • Quello che risulta difficile in WP è riscrivere una struttura dei permalink come 2012/09/post in %category%/%post_name%. Se Google ha indicizzato i tuoi articoli con la prima struttura e vuoi un redirect 301 alla nuova struttura, non puoi farlo con le espressioni regolari perchè non sai a quale categoria appartiene il post. Puoi fare al limite un %post_name% conoscendo l’ultima parte dell’URL, ma per il primo caso non sono riuscito ancora a trovare una soluzione valida. Qualche idea?

  • Ottimo articolo, complimenti! Davvero utile e semplice anche per i non addetti ai lavori… 🙂

  • Buon articolo.
    Sono comunque tanti i CMS in cui l’argomento di automatismo dei link non viene affrontato nel modo giusto, e che spesso da problemi a chi non ha abbastanza pratica.

    Saluti. Alessio.

    • Ciao Alessio, la penso come te, infatti la gestione dei link dovrebbe essere una priorità per tutti gli sviluppatori. Prima di “avventurarsi” bisogna avere le idee chiare e proporre una struttura link autonoma.

  • vorrei creare un .htaccess file solo per velocizzare il sito,

    potresti indicare qualche codice

    grazie

  • ho un problema e per risolverlo devo inserire nel htacess default language “IT”
    non so farlo, qualche anima buona mi aiuta?
    Ringrazio anticipatamente
    Angela

  • Ho un sito in Joomla che ho trasferito in WordPress, sono oltre 3000 articoli quindi non posso fare redirect singoli.
    Tramite .htacess ho impostato la regola per rimuovere l’estensione html alla fine delle URL, in modo da reindirizzarle correttamente all’articolo wp corrispondente.
    Il problema è che mi applica la regola anche alle (poche) pagine in cui avrei bisogno di un redirect personalizzato (impostato con redirection). C’è un modo per impostare la regola, senza farle sovrascrivere i redirect customizzati?
    Questo è il file e grazie in anticipo!

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_URI} \.html$
    RewriteRule ^(.*)\.html$ $1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

  • Ciao, avrei necessità di capire come posso reindirizzare a nuove pagine web del mio sito le vecchie pagine ancora con estensione htm (le nuove hanno estensione html) – esempio: per evitare l’errore 404 vorrei reindirizzare il mio visitatore dalla vecchia pagina: http://www.internieprogetti.it/arredare-un-soggiorno-con-cucina-a-vista.htm a quella nuova che ha nome uguale ma estensione html. Come dovrebbe essere la sintassi del file htaccess e si possono inserire piu’ pagine ? Da quando ho rifatto il sito ho perso un po’ di posizioni forse proprio perchè non ho fatto i redirect di tutte le pagine da htm a html e gli spider me le considerano pagine nuove. Hai qualche buon consiglio da darmi per recuperare le posizioni precedenti ? Grazie mille . Massimo

×