Una delle cose più importanti di un'applicazione web pubblica è la scelta del formato dei link. Per capire il motivo di tale importanza è bene dire che quando si parla di applicazione web pubblica si fa riferimento a contenuti di tipo html creati dinamicamente e destinati ad un pubblico ampio e indefinito.
Questo vuol dire che possiamo disinteressarci della cosa se l'applicazione web in costruzione non ha motivi prettamente divulgativi. Se produciamo un software web based per la gestione delle prenotazioni di un albergo, non ci interesserà scegliere un formato particolare per i link.
In sostanza si capisce come il discriminante fra il porsi il problema o meno sia dato dall'utenza potenziale dell'applicazione.
Ma facciamo un ulteriore passo indietro. Chiediamoci perchè è giusto porci il problema. La risposta è molto semplice :)
Nelle applicazioni web definite dinamiche, le pagine non esistono fisicamente. Così per questo blog non esiste una pagina statica scritta in linguaggio HTML per ogni post. Allo stesso modo i commenti non sono integrati fisicamente nella pagina, ma tutto il contenuto del blog viene estratto da un database (nel mio caso MySQL) e creato sul momento in base alle direttive date dal sistema.
Di fatto questa pagina non esiste. E' solo la risultanza di una richiesta inviata al server da voi che leggete l'articolo. Non vi siete accorti di aver chiesto qualcosa al server vero? Eppure lo avete fatto. E sapete tramite cosa? Tramile il permalink di questo post :) . Nel link ci sono le direttive che verranno usate dal sistema per creare la pagina che state leggendo. In termini tecnici si dice che l'URL è una query string. Per farla semplice, l'URL non punta ad una posizione fisica individuata sul server, ma chiama l'esecuzione di un programma in funzione dei parametri contenuti nelle query string stessa.
Non ci state capendo una mazza? Basta fare un esempio facile facile! Sempre rimanendo in casa, in questo blog integro anche la versione mobile con layout ultra leggero per la massima accessibilità da dispositivi mobili (cellulari ed altro). Per accedere alla versione mobile del blog dovete digitare questo indirizzo:
http://www.davidonzo.com/?mobile=1
Che scritto più compiutamente diventa:
http://www.davidonzo.com/index.php?mobile=1
Il permalink di un post della versione mobile è qualcosa del genere:
http://www.davidonzo.com/index.php?post=681&mobile=1
Come vedete in tutti i casi chiamo il file index.php, che utilizzerà le variabili inviate via GET: l'id del post e l'attivazione della visualizzazione mobile.
Non esiste fisicamente la pagina richiesta. Questa viene creata all'istante tramite una query string adeguata. Ma tale tecnica, in funzione di ottimizzazioni SEO, ha molte controindicazioni.
Ai motori di ricerca non piacciono le query string. Sono la prova che il contenuto della pagina è dinamico. In altre parole una query string dice al motore di ricerca "Hey, stai attento ad indicizzare certi contenuni, perchè la pagina non esiste fisicamente ed il suo contenuto può cambiare facilmente. Stai acquorto!"
Questo produce un rallentamento dell'indicizzazione. Nonostante nella maggior parte dei casi il permalink di un post sia sinonimo di contenuto sempre uguale, i motori di ricerca tendono a non fidarsi.
Altro aspetto, secondo me meno rilevante, ma pur sempre da considerare, è la reazione dell'utente ad un link pieno di parametri, alcuni dei quali potrebbero apparire poco convincenti.
In ultimo, i motori di ricerca indicizzano come elementi primari di una pagina, l'attributo title ed il link. Se in quest'ultimo possono esserci elementi buoni di indicizzazione, sarà meglio per tutti!
Come sistemare la situazione? Ci sono diversi modi, ma il più semplice ed allo stesso tempo, potente c'è dato da Apache. Ovviamente se non utilizziamo Apache quello che segue è abbastanza inutile :)
Per un giusto utilizzo dobbiamo controllare che il mod_rewrite sia attivano sul web server e che le direttive di Override permettano al file .htaccess di lavorare adeguatamente. Un AllowOverride All ci da la certezza di poter usare appieno il file .htaccess ;)
Una volta controllato che il mod_rewrite sia abilitato e controllato anche che le impostazioni di override diano i poteri necessari al magico file di Apache, possiamo cominciare a scrivere il nostro .htaccess. Per prima cosa dobbiamo attivare il mod_rewrite, dire ad Apche di seguire i link simbolici e determinare la directory base in cui verrà eseguito il rewrite. In cima al file scriveremo:
RewriteEngine On
Option +FollowSymLinks
RewriteBase /
Ora si stia attenti ad un concetto fondamentale. Spesso quando si parla di rewrite si intende la tecnica con la quale si riscrive una query string in formato che chiameremo friendly permalink. In realtà facciamo esattamente l'opposto!
Scriviamo e facciamo cliccare su permalink di tipo tradizionale, senza parametrizzazione, con indicazione di directory varie, ma grazie al lavoro del mod_rewrite questo verrà riscritto ed interpretato dal server in formato query string. Formato necessario perchè la nostra applicazione web possa interpretare nel giusto modo la richiesta del client.
Per cui diremo al webserver come riscrivere il permalink friendly in formato query string. Utilizzeremo istruzioni di questo tipo:
RewriteRule ^prova/([^/\.]+)/?$ index.php?prova=$1 [L]
Di fatto andiamo ad utilizzare la sintassi usata nelle espressioni regolari. Nell'esempio di sopra diciamo al webserver che un URL di tipo http://www.miosito.com/prova/qualcosa/ dovrà essere interpretato come http://www.miosito.com/index.php?prova=qualcosa.
Fin qui è abbastanza semplice. Scomponiamo la riga:
RewriteRule: il comando che fa capire ad Apache che stiamo per impartire una regola
- ^prova/(^/\.+)/?$: il link da riscrivere in cui diciamo che sarà formato da una directory /prova/ seguito da un valore e terminante per /
- index.php?prova=$1: l'indirizzo da interpretare.
- [L]: il flag che interrompe il persing delle regole nel momento in cui questa va a buon fine.
In un file .htaccess possono esserci tutte le regole di rewrite che vogliamo. Utilizzando il flag [L] siamo sicuri che la regola che va a buon fine farà partire la richiesta al webserver senza seguire ulteriormente il file stesso.
Ma stiamo attenti, se è vero che possiamo inserire tutte le regole che vogliamo, è pur vero che un file .htaccess troppo carico di regole potrebbe rallentare il lavoro di Apache ed ingolfare la navigazione.
Un modo per far convivere regole molto simili a condizioni diverse è l'uso del comando RewriteCond. Equivale al flusso if di molti linguaggi di programmazione. Se si verifica la condizione necessaria, allora si attiva la regola di rewrite. Di seguito un esempio:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /404.html [L]
La regola dice che se il file (-f) o la directory -d non esistono (il ! è una negazione), reindirizziamo al file 404.html. E' solo un esempio. Chiaramente per fare la stessa cosa in modo molto più semplice basterà usare la direttiva:
ErrorDocument 404 /404.html
Era giusto per spiegare il concetto :)
Ora provete voi! Con il vostro editor di testo preferito create due file:
- index.php che conterrà:
<?php
echo '<h1>' . $_GET['prova'] . '</h1>';
?>
- .htaccess che conterrà
Options +FollowSymLinks #Modificalo in funzione della tua webdirectory!
RewriteEngine On
RewriteBase /
RewriteRule ^prova/([^/\.]+)/?$ index.php?prova=$1 [L]
Accedi digitando http://www.tuosito.com/prova/ciao/. Se visualizzerai:
Ciao
Avrai fatto tutto come si deve ;)
NB: questo è solo un miliardesimo di quello che si può fare con .htaccess. La guida su apache.org resta il riferimento base!






