Tecniche di ottimizzazione degli url : Il Mod Rewrite di Apache. Come abilitarlo e fare prove in locale sotto windows

Spesso vi sarà capitato di vedere su alcuni siti gli url delle pagine come se fossero suddivisi in tante cartelle, ovvero url del tipo: www.dominio.com/pagina1/pagina2/pagina.html o cose simili (anche questo sito è fatto così). Nella maggioranza dei casi non si tratta di una vera e propria suddivisione reale in cartelle ma di una tecnica molto usata dai webmaster nell’ambito del SEO (Search Engine Optimizing – Ottimizzazione dei motori di ricerca). In cosa consiste?

Lo spiego brevemente per gli addetti ai lavori e non: normalmente quando si richiamano pagine dinamiche (cito il php) alle quali passare dei parametri si utilizza la querystring (una serie di accopiate variabile/valore passate dopo il punto interrogativo). Ovvero, volendo dire ad uno script php che mi restituisce a video dei messaggi, di farmi visualizzare la pagina n°30 in genere si utilizza una cosa del genere:

nome_dello_script.php?p=30

quel “p=30” è la querystring, ovvero dico allo script php di essere eseguito impostando al suo interno la variabile p al valore 30, poi le istruzioni al suo interno faranno il resto in base al valore di p. Esiste però un trucco per fare in modo che l’url passato al browser diventi una cosa del genere:

nome_dello_script.php/30/

o ancora

pagina/30.html

e quant’altro la fantasia suggerisce.

In effetti fare in modo che una pagina venga visualizzata come una sottocartella anzichè con la querystring è una cosa tutt’altro che banale in quanto consente ai motori di ricerca (Google in primis) di indicizzare meglio la nostra pagina.

Mettiamo ad esempio che un sito che visualizza articoli abbia lo script che funzioni in questo modo:

www.sito.com/articolo.php?id=5

lo script mi visualizzerà l’articolo che ha 5 come indice (nel database), volete mettere invece che l’url sia scritto come:

www.sito.com/articoli/titolo_dell'articolo/

è ovvio che il motore di ricerca preferirà di gran lunga l’url scritto nel secondo modo anche perchè nel “titolo_dell’articolo” saranno ovviamente contenute parole chiave che porteranno la pagina a posti più in alto durante una ricerca su un motore. Fermo restando che gli script in php rimarranno sempre uguali c’è un sistema che permette di “ingannare” i browser e quindi anche i motori di ricerca facendo apparire un indirizzo differente e molto più “digeribile”.

In questo articolo faccio riferimento al web server Apache (mi pare che comunque una funzione simile sia disponibile anche per i server IIS).

Chi ha installato pacchetti precompilati per lavorare con apache/php/mysql sotto windows (o è stato cosi bravo da riuscire a installarli da solo a mano) può sfruttare ugualmente questa caratteristica interessante per provare il funzionamento degli url (ho provato io con il pacchetto easyphp).

Innanzitutto bisogna abilitare il Rewrite Engine di Apache

Aprire il file di configurazione di apache (httpd.conf, si trova in /apache/conf/)

Andare nella sezione “Dynamic Shared Object (DSO) Support”

decommentare (ovvero togliere #) da:

LoadModule rewrite_module modules/mod_rewrite.so

più in basso togliere il commento a:

AddModule mod_rewrite.c

Adesso c’è una piccola parentesi: le regole da dare ad apache per fargli capire che un indirizzo è in realtà un’altro andranno scritte nel “famigerato” file .htaccess che i programmatori di Linux/Apache/Mysql/Php conoscono bene. Si tratta in pratica di un file che verrà letto da apache ogni volta che un browser richiede una pagina che si trova in una cartella che contiene tale file. Se tale file si trova nella radice del server, sarà letto sempre.

Windows non permette di creare nomi di file vuoti (.htaccess infatti non ha nome file! è solo “punto” ed estensione “htaccess”) quindi per rendere le cose più facili possiamo andare più in basso ancora, alla riga:

AccessFileName .htaccess

e possiamo cambiarla ad esempio in

AccessFileName a.htaccess

in questo modo il nostro file “.htaccess” da ora in poi si dovrà chiamare “a.htaccess”, ovviando ai problemi che ci possono essere in ambiente windows a creare un nome di file vuoto. Dobbiamo quindi riavviare Apache.

Nota: Ovviamente dopo fatti gli esperimenti in locale, se vogliamo caricare il file htaccess sul nostro server dobbiamo ricordarci di rinominarlo (in remoto) in .htaccess

A questo punto illustro semplici configurazioni per riscrivere gli url.

Apriamo il blocco note di windows, salviamo con nome (ricordo di mettere tra virgolette il nome del file altrimenti il notepad mette in automatico l’estensione .txt) e incominciamo a compilare il nostro file .htaccess con:

RewriteEngine On

Questo serve per dire ad apache di attivare il Rewrite Engine. Quindi andiamo a capo e cominciamo a scriverci tutte le nostre regolette per riscrivere gli url (una su ogni riga).
Ad esempio:

RewriteRule ^pagina/([^/]+)/([^/]+).html$ page_show.php?p=$1&c=$2 [L]

cosa significa?

Qui dico ad Apache: se vedi un indirizzo fatto in questo modo:

pagina/([^/]+)/([^/]+).html

notare che all’inizio della regola impostata con la direttiva RewriteRule, abbiamo ^ all’inizio e $ alla fine, questo si usa per delimitare la parte di indirizzo che vogliamo analizzare, invece le parti contenute tra parentesi [^/]+ fanno parte delle cosiddette espressioni regolari che meritano un capitolo a parte, vi basterà sapere in questo esempio che apache interpreta[^/]+ come : qualsiasi numero e tipo di carattere tranne lo slash /

lo devi trasformare in:

page_show.php?p=$1&c=$2

dove $1 verrà sostituito da Apache con la parte contenuta nella prima posizione indicata tra parentesi tonde ([^/]+) (ovvero dopo pagina/) e $2 verrà sostituito con il contenuto della seconda posizione tra parentesi tonde, ovvero ([^/]+) che è vicino a .html

in pratica se nel browser digitiamo un indirizzo del tipo:

pagina/123/789.html

Apache, leggendo il file .htaccess si renderà conto che questo indirizzo rispetta la regola in esso definita e quindi lo convertirà (non in maniera visibile agli utenti) in:

page_show.php?p=123&c=789

(che in effetti è l’indirizzo reale della pagina)

il [L] alla fine serve ad indicare che le regole non sono finite per cui a capo ce ne sarà un’altra, il [L] non verrà quindi messo per l’ultima regola.

Possiamo quindi creare un file di testo e scrivere all’interno cose del genere:

RewriteEngine On
RewriteRule ^pagina/([^/]+)/([^/]+).html$ page_show.php?p=$1&c=$2 [L]
RewriteRule ^ciao.html$ page.php

La prima regola abbiamo visto come viene interpretata da apache, la seconda dice ad apache che se vede un indirizzo che termina con ciao.html (www.sito.com/ciao.html) lo deve interpretare come page.php (www.sito.com/page.php).

Per esempi più approfonditi vi consiglio sicuramente la guida ufficiale di Apache su questa tecnica che viene anche chiamata mod rewrite:

http://httpd.apache.org/docs/1.3/misc/rewriteguide.html

http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

E di dare una lettura ad un ottimo articolo sulle espressioni regolari per apache:

http://www.evolt.org/article/rating/20/22700/

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)