Semplice guida al mod_rewrite, significa che darò delle indicazioni di base sulla scrittura di un file mod_rewrite che di certo non pretende rispecchiare tutte le capacità e funzioni di Apache.

Per queste ragioni vi introduco alcune direttive da inserire nel vostro file .htaccess per dare una spinta in più al vostro sito web, in termini di struttura di link.

Per iniziare…

RewriteEngine On: istruzione iniziale e che indica l’attivazione del modulo

REDIRECT: esistono diversi tipi di redirect. Ogni tipo di redirect indica un diverso motivo per cui viene fatto un reindirizzamento. In particolare esso fa parte degli Http Status Code che sono quei codici di tre cifre che iniziano per “3”, ad esempio “300”, “301”. In particolare i più importanti: 300 – scelta multipla, 301 – spostato in modo permanente, 302 – redirect, 303 – vedi un’altra risorsa.

Come si scrive un redirect?

Redirect 301 /vecchia_pagina.html http://www.miosito.com/nuova_pagina.html

Un redirect è una possibilirà SEO interessante in quanto permette di dire in modo lecito ai motori di ricerca che la mia vecchia pagina è stata spostata in modo permamente e perciò considera la nuova pagina come attendibile e come suggerita per essere una degna erede della vecchia.
*Un redirect può essere eseguito anche in PHP col seguente codice:

header ('HTTP/1.1 301 Moved Permanently');
header ('Location: http://www.miosito.com/nuova_pagina.php');

se inserito nella pagina che volete dismettere (vecchia_pagina.php) e che sia ovviamente in linguaggio PHP.

REDIRECT DELLA ROOT

Un’altra direttiva utile ed interessante da inserire nel file .htaccess è quella che riguarda la necessità di avere www o no all’inizio del nome di dominio.

Per fare ciò è necessario scrivere un blocco di tre righe di codice che tramite sempre l’uso di redirect vi permette lo spostamento verso l’url desiderato.


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

Con questo esempio si sposta “miosito.com” verso “www.miosito.com”.
Per fare il contrario, cioè togliere definitvamente il “www” basta modificare l’ultima delle tre righe togliendo proprio il www, cioè:

RewriteRule (.*) http://miosito.com/$1 [R=301,L]

Salvo casi eccezionali, la rimozione del www è consigliabile in quanto avete 4 caratteri (3+1 – www+.) in meno nella url, dando una percenutale in più di importanza al resto della url e delle parole chiave in essa presente.

Altra cosa importante è evitare che si passi ranking sia alla home miosito.com/ che alla index, ad esempio miosito.com/index.php. E’ bene che ci sia una versione sola della home, per cui, in virtù del principio di minor numero di caratteri ottimizzato al numero di parole chiave, si consiglia l’uso dell’homepage come miosito.com/

Col seguente codice otteniamo quanto detto:


RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.miosito.com/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ed ora arriviamo a regolette molto importanti proprio per la riscrittura delle pagine e delle variabili di GET, che spesso fanno la vera differenza nella struttura dei links di un sito web.

In particolare ricordiamoci che bisogna dotare ogni regola del giusto numero di parametri e stare attenti alle pagine DIVERSE ma con o stesso NUMERO di parametri in quanto potreste avere degli effetti indesiderati di aliasing.

Una regola tipo è la seguente:

RewriteRule ^([^/\.]+)/([^/\.]+)/$ pagina.php?get1=$1&get2=$2 [L]

Con questa regola diciamo “qualsiasi valore nella prima posizione dell’url, mappala con la variabile get1, qualsiasi valore nella seconda posizione mappala con la varibile get2”. Questa interpretazione un pò verbosa e maccheronica serve a farci capire come sia importante ma anche delicata l’operazione di riscrittura degli url.
Se volessimo ad esempio mappare un particolare valore della varibile get1, ad esempio se get1 è il nome della categoria e get2 il titolo del post in quella categoria, scriveremo:


RewriteRule ^categoria1/([^/\.]+)/$ pagina.php?get1=categoria1&get2=$2 [L]
RewriteRule ^categoria2/([^/\.]+)/$ pagina.php?get1=categoria2&get2=$2 [L]

Detto questo non resta che sperimentare, in locale e a parità di supporto, le potenzialità della riscrittura degli url e l’uso del mod_rewrite e del file .htaccess.
*Per questa opportunità, cioè avere stringhe e non valori numerici, vi consiglio di fare attenzione alla SQL-Injection, in quanto utenti malevoli potrebbero inserire nel vostro url (a dire il vero sia quello riscritto che non) del codice SQL per trafugare, modificare o eliminare i vostri dati!

Inoltre analizziamo l’opportunità di usare degli ID numerici, come ad esempio in un contesto di news o prodotti di un negozio online:

RewriteRule ^([^/\.]+)/([0-9])+/$ pagina.php?categoria=$1&prodotto=$2 [L]

I

In particolare ricordate che:

  1. – scrivere un .htaccess sbagliato causerà un errore 500, nella maggior parte dei casi, e quindi il vostro sito risulta non raggiungibile
  2. – scrivere un .htaccess in locale e copiarlo in remoto sulla cartella ftp può significare non cautelarsi della versione di apaache e quindi avere eventuali problemi di compatibilità tra versioni
  3. – ogni cartella può avere un suo file.htaccess che ha azione sulla cartella in cui è presente e tutte le sottocartelle, per default. Ad esempio se volessi nella root un metodo di riscrittura e a tutte le sue sottocartelle, meno che in una, in cui devo riscrivere gli url in modo diverso, lì devo creare un nuovo file .haccess con le regole di interesse
  4. – dotare ogni regole di [L] finale farà si che il modulo legga il file .htaccess solo fino a quel punto senza proseguire nelle altre regole che potrebbero sovrascrivere erroneamente la regola giusta