24 maggio 2009

URL! URL! URL!

Foto di Bull3t @ flickr.com
Guardando qua e là nel web, ti sarai imbattuto in un sacco di URL tipo questo:
/content.cgi?date=2009-02-21/article.cgi?id=46&page=1
Degli script lato-server generano il contenuto di queste pagine. Il contenuto di una particolare pagina è univocamente determinato dall'URL, proprio come se avessi richiesto una pagina con URL /content/2009-02-01.html oppure /article/46.1.html.

Quest'ultime sono diverse da quelle generate dal server in risposta ad un form di un carrello spesa virtuale o di un'iscrizione. Comunque, i motori di ricerca non indicizzeranno i contenuti dinamici, perche i motori di ricerca ignorano le pagine generate dagli script CGI in quanto potenziali vicoli ciechi.



Un motore di ricerca preferisce seguire URL come
/content/2009/02/21,

quindi un modo di mappare l'URL /content/2009/02/21 nello script /content.cgi?date=2009-02-21 sarebbe utile. Non solo i motori di ricerca seguiranno un tale link, ma l'URL stesso è facile da ricordare. Un visitatore abituale del sito saprebbe come raggiungere la pagina per ogni giorno di pubblicazione dei contenuti.

Quando nel mio blog ho cambiato l'interfaccia per visualizzare i contenuti in base all'argomento da /meta.php3?meta=XML a /meta/XML, i motori di ricerca come Google hanno iniziato ad indicizzarmi, e sto ricevendo più visite mandate dai motori di ricerca.


Il trucco è di dire al mondo esterno che la tua interfaccia è una cosa: /content/YYYY/MM/DD, ma quando si compone la pagina, si accede a /content.cgi?date=YYYY-MM-DD. I web-server come Apache, i CMS come Userland’s Manila e l'open source Zope supportano questo genere di astrazione.
L'astrazione è utile anche perché l'infrastruttura di un sito è raramente stabile nel tempo. Quando gli ingegneri sostituiscono gli script CGI in Perl con le JSP, e gli URL diventano /content.jsp?date=YYYY-MM-DD, i preferiti salvati dai tuoi utenti si invalidano. Quando usi un'astrazione, i tuoi utenti aggiungono ai preferiti /content/YYYY/MM/DD, e quando cambi il back-end, tu aggiorni /content/YYYY/MM/DD a puntare a /content.jsp?date=YYYY-MM-DD senza invalidare i preferiti.
Se non stai pubblicando contenuti dinamici, e hai URI tipo:
/content-YYYY-MM-DD.html,
non hai il problema di indicizzazione che hai con i contenuti dinamici. Comunque, potresti ancora voler adottare questo tipo di URI per coerenza con gli altri siti. Ricorda che la gente che visita il tuo sito vuole usare un'interfaccia familiare, e gli URI sono parte della tua intefaccia.

Riscrivere un URL in Apache

Il web-server Apache gira sia su Unix che su NT, e ha un componente opzionale, mod_rewrite, che riscriverà gli URL per te. Non fa parte dell'installazione standard. Pair Networks, Dreamhost, e Hurricane Electric, ce l'hanno abilitato sui loro server. Se gestisci un server in proprio, controlla col tuo amministartore di sistema che sia installato, se no fallo installare.
Il modulo mod_rewrite funziona esaminando ogni URL richiesto. Se l'URL richiesto soddisfa una regola di riscrittura dell'URL, la regola viene attivata e la richiesta viene inoltrata coll'URL riscritto.
Se non sei pratico di Apache, sarai affascinato dalle funzioni dei suoi file di configurazione. Il miglior punto da cui lanciare mod_rewrite è il file httpd.conf, però puoi pure chiamarlo dal file .htaccess di qualunque directory. Se non hai accesso ai file di configurazione del tuo web-server, devi usare .htaccess, tuttavia comprendi che c'è un abbassamento di prestazioni perchè Apache deve leggere .htaccess ogni volta che un URL viene richiesto.

Lo scopo

Lo scopo è creare un insieme di regole in mod_rewrite che possano trasformare una stringa come questa:
/content/YYYY/MM/DD
nella versione a parametri come quella mostrata tra poco, oppure in qualcosa di simile, purchè sia il giusto URI del tuo script.
/content.cgi?date=YYYY-MM-DD

L'idea

Cominciamo coll'URI /content/YYYY/MM/DD e nel voler arrivare a /content.cgi?date=YYYY-MM-DD. Abbiamo bisogno di fare alcune cose:
  1. Riconoscere l'URI
  2. Estrarre /YYYY/MM/DD e trasformarlo in YYYY-MM-DD
  3. Scrivere la forma finale dell'URI /archives.cgi?date=YYYY-MM-DD

Espressioni Regolari e la RewriteRule

Questa trasformazione richiede due direttive del mod_rewrite: RewriteEngine e RewriteRule. RewriteEngine è una direttiva che accende e spegne la funzione di riscrittura. E' lì per risparmiare all'amministratore le battute sulla tastiera, quando vogliono o hanno bisogno di disabilitare la funzione. RewriteRule usa un parser di espressioni regolari che confronta l'URL o l'URI con una regola e l'attiva se viene soddisfatta.
Se stiamo impostando la regola dalla directory, essa viene attivata usando il file .htaccess, allora bisogna scrivere:
RewriteEngine On
RewriteRule ^archives/([0-9]+)/([0-9]+)/([0-9]+)$ archives.cgi?date=$1-$2-$3
Quello che la regola fa è cercare una stringa 'archives' seguita da gruppi di una o più cifre (la parte [0-9]+) separate dallo '/', e poi la riscrive come archives.cgi?date=YYYY-MM-DD. Il parser per mezzo di riferimenti salva i tre gruppi di cifre nelle parentesi e poi li sostituisce nelle variabili $1, $2, $3.
<attenzione>Se la tua pagina contiene link relativi, questi saranno risolti relativamente al percorso /archives/YYYY/MM/DD, non /archives. Vuol dire che i tuoi link relativi non saranno più validi. Dovresti usare l'elemento <base> nell' <head> della pagina per riagganciare i link.</attenzione>

La RewriteRule per contenuti statici

Se hai una serie di file HTML statici nella root del web-server:
/news-2008-12-31.html
/news-2009-01-01.html
/news-2009-01-02.html
...e vuoi che i tuoi lettori accedano ad essi con URL tipo /archives/1999/12/31, allora hai bisogno di una regola di rewrite nella root, come questa:
RewriteRule ^archives/([0-9]+)/([0-9]+)/([0-9]+)$ /news-$1-$2-$3.html
RewriteRule ^archives$ /index.html
Se i file news-YYYY-MM-DD.html sono dentro la cartella /archives, la regola dovrebbe essere:
RewriteRule ^/archives/([0-9]+)/([0-9]+)/([0-9]+)$ /archives/news-$1-$2-$3.html
Se invece vuoi usare un file .htaccess dentro la cartella /archives, la regola diventa:
RewriteRule ^([0-9]+)/([0-9]+)/([0-9]+)$ news-$1-$2-$3.html
Inoltre, puoi cancellare la seconda regola di rewrite e usare al suo posto la regola DirectoryIndex.
DirectoryIndex index.html

Casi limite

Cosa succede se qualcuno batte http://www.yoursite.com/archives invece di http://www.yoursite.com/archives/YYYY/MM/DD? Il modulo mod_rewrite cerca una regola da soddisfare se non la trova termina senza far nulla. Possiamo aggiungere una regola finale per gestire questo caso.
RewriteEngine On
RewriteRule ^archives/([0-9]+)/([0-9]+)/([0-9])+$ archives.cgi?date=$1-$2-$3
RewriteRule ^archives$ index.html
Nell'esempio si ha la redirezione verso la pagina index.html. Però potresti redirigere verso una pagina che genera un form di ricerca.

E se il mio server non è Apache?

Sfortunatamente IIS non viene fornito con un meccanismo di riscrittura. Puoi scrivere un filtro ISAPI che faccia questo per te.
Se gestisci un CMS Manila, esso ha l'opzione Userland’s Frontier, che ti permette di assegnare ad un particolare contenuto un semplice URL.
Il sistema di pubblicazione Zope pure supporta il mappaggio di path in parametri per gli scrip del server.

Riferimenti

Gli URL buoni sono parte della progettazione di un'interfaccia. Jakob Nielsen discute ciò in un suo Alertbox (in inglese): http://www.useit.com/alertbox/990321.html.
Questo articolo è stato in parte inspirato dalla osservazione di Tim Berners-Lee che gli URL buoni non cambiano (in inglese): w3.org/Provider/Style/URI.
Rafe Engelschall ha molti esempi su mod_rewrite a mo' di ricettario nel suo sito (in inglese): http://www.engelschall.com/pw/apache/rewriteguide/.
Io uso queste tecniche per creare una interfaccia standard nel mio blog.

Note e Meriti

Translated with the permission of A List Apart Magazine and the author[s].
Questo articolo scritto da Bill Humphries sulla rivista online A List Apart il 30 giugno del 2000, conserva tutt'oggi un'attualità sorprendente. Dopo 9 anni e alla rapidità con cui evolve il web poteva essere privo di ogni significato, segno che le cose fatte bene sono destinate a durare. Tuttavia si notano segni di invecchiamento quando l'autore parla della abitudine dei motori di ricerca a ignorare i contenuti dinamici. Oggi sappiamo che non è più così.
Ringrazio Laura per la consulenza in Inglese.

Nessun commento:

Posta un commento