Il rewrite engine (rewrite = ri­scri­ve­re, engine = macchina) è un com­po­nen­te del web server che permette di ri­scri­ve­re o rein­di­riz­za­re gli Uniform Resource Locator (URL). Il rewrite engine più co­no­sciu­to è il mod_rewrite del server Apache HTTP, ma anche gli altri web server, come nginx o lighttpd, mettono a di­spo­si­zio­ne funzioni simili.

Questo com­po­nen­te software è ad esempio usato in presenza dei classici URL generati dai CMS che devono essere riscritti in URL più intuitivi e quindi più user-friendly. I motivi per cui questo processo risulta ne­ces­sa­rio sono fa­cil­men­te intuibili. URL tecnici come

"http://esempio.com/a/index.php?title=ti­to­lo­pa­gi­na"

non sono me­mo­riz­za­bi­li fa­cil­men­te dagli utenti; il rewrite engine consente di rendere ac­ces­si­bi­le la stessa risorsa pa­ral­le­la­men­te su URL chiari e semplici:

"http://esempio.com/articolo/ti­to­lo­pa­gi­na"

Un utente può così usare questo URL per aprire la pagina cor­ri­spon­den­te. Se arriva una richiesta dal web server, il rewrite engine riscrive au­to­ma­ti­ca­men­te l’URL nello schema interno uti­liz­za­to dal server, quindi come "http://esempio.com/a/index.php?title=ti­to­lo­pa­gi­na".

Il rewrite engine genera così una sorta di livello di astra­zio­ne tra gli URL che uti­liz­za­no il progetto in­ter­na­men­te e quelli che vengono vi­sua­liz­za­ti pub­bli­ca­men­te in rete. Ciò consente, in­di­pen­den­te­men­te dalle richieste tecniche interne, di mettere a di­spo­si­zio­ne uno schema di indirizzi unitario e user-friendly da mostrare all’esterno.

In­ter­na­men­te si può con­ti­nua­re ad uti­liz­za­re un indirizzo dinamico e che risponde a precisi parametri, mentre l’utente in rete accede al sito web tramite un indirizzo ap­pa­ren­te­men­te statico. Ne consegue il vantaggio che gli URL pre­sen­ta­ti agli utenti rimangono validi, anche se vengono apportate modifiche interne alla gerarchia dei file.

I webmaster possono rea­liz­za­re con il rewrite engine i rein­di­riz­za­men­ti in base a delle precise con­di­zio­ni. Così è, ad esempio, possibile creare rein­di­riz­za­men­ti basati sull’iden­ti­fi­ca­zio­ne dello User Agent o dell’indirizzo IP del client ri­chie­den­te per impostare la lo­ca­liz­za­zio­ne geo­gra­fi­ca o per vi­sua­liz­za­re i siti ot­ti­miz­za­ti su diversi di­spo­si­ti­vi. Ge­ne­ral­men­te si utilizza un redirect 301 che assicura la me­mo­riz­za­zio­ne di una sola versione del sito nell’indice dei motori di ricerca, malgrado coe­si­sta­no delle pagine Mobile ag­giun­ti­ve o diverse versioni in più lingue.

I webmaster do­vreb­be­ro invece prendere le distanze dalle pratiche di cloaking, in cui vengono vi­sua­liz­za­te pagine spe­ci­fi­ca­men­te ot­ti­miz­za­te per i crawler dei motori di ricerca al solo scopo di mi­glio­rar­ne il ranking.

Esempi di ap­pli­ca­zio­ne

Il rewrite engine mette a di­spo­si­zio­ne diversi comandi per ma­ni­po­la­re gli URL, che si possono annotare come regole in diversi punti del web server. Così il mod_rewrite, il rewrite engine del web server Apache, può uti­liz­za­re diversi container, come una directory all’interno del file httpd.conf, di un segmento del Vir­tua­lHo­st o all’interno del file .htaccess. Su nginx le direttive per l’URL Rewriting sono presenti nel file di con­fi­gu­ra­zio­ne /etc/nginx/nginx.conf, mentre su lighttpd è messo a di­spo­si­zio­ne nel file /etc/lighttpd.conf nella con­fi­gu­ra­zio­ne di vHost.

Per ri­scri­ve­re gli URL dinamici come "http://esempio.com/a/index.php?title=ti­to­lo­pa­gi­na" tramite il rewrite engine in URL statici come "http://esempio.com/articolo/ti­to­lo­pa­gi­na", si uti­liz­za­no diversi comandi a seconda si impostino i rein­di­riz­za­men­ti su un web server Apache, nginx o lighttpd.

Il rewrite engine su Apache

Per uti­liz­za­re il mod_rewrite su Apache, il rewrite engine deve essere attivato con la direttiva Rew­ri­teEn­gi­ne on. A questa segue la Rew­ri­te­Ru­le, in cui sono definite le in­di­ca­zio­ni per l’URL Rewriting ser­ven­do­si di espres­sio­ni regolari (“regular ex­pres­sions”, Regex):

RewriteEngine on
RewriteRule ^/articolo/(.*)$ /a/index.php?title=$1

Se tramite la Rew­ri­te­Ru­le deve essere impostato un rein­di­riz­za­men­to, si prendono es­sen­zial­men­te in con­si­de­ra­zio­ne due parametri: lo schema di ricerca e lo schema di de­sti­na­zio­ne.

  • Lo schema di ricerca: questo parametro descrive gli URL che devono essere rein­di­riz­za­ti. Per questo viene definita una con­di­zio­ne precisa sotto forma di sequenza numerica. Se questa con­di­zio­ne viene sod­di­sfat­ta, si verifica un rein­di­riz­za­men­to ad un URL secondo lo schema di de­sti­na­zio­ne. Nell’esempio attuale lo schema di ricerca della Rew­ri­te­Ru­le indicata nel segmento sarebbe: ^/articolo/(.*)$.
  • Lo schema di de­sti­na­zio­ne: questo parametro descrive l’URL alla quale bisogna rein­di­riz­za­re. Se il rein­di­riz­za­men­to è impostato a livello di server, si verifica una so­sti­tu­zio­ne dell’URL completo. A livello della directory, nel file .htaccess o all’interno di quello httpd.conf viene sem­pli­ce­men­te so­sti­tui­to il percorso a partire dalla cartella attuale. Nell’esempio lo schema di de­sti­na­zio­ne comprende questo tipo di Rew­ri­te­Ru­le: /a/index.php?title=$1.

La tabella qui sotto mostra una spie­ga­zio­ne delle espres­sio­ni regolari usate nell’esempio:

Espres­sio­ni regolari Spie­ga­zio­ne
^ Indica l’inizio di una stringa.
$ Segna la fine di una stringa.
(.*) Un se­gna­po­sto per una sequenza numerica qualsiasi in un URL. Le parentesi salvano la sequenza numerica in una variabile.
$1 Una variabile che consente di accedere ai valori me­mo­riz­za­ti tem­po­ra­nea­men­te, salvati uti­liz­zan­do le parentesi.

La Rew­ri­te­Ru­le ^/articolo/(.*)$ /a/index.php?title=$1 definisce così la regola che tutti gli URL che co­min­cia­no con la stringa /articolo/(.*) vengono riscritti nello schema di URL dinamico con questo segmento /a/index.php?title=$1, dove $1 sta per la sequenza numerica che cor­ri­spon­de al se­gna­po­sto (.*). Se un utente inserisce un URL statico nel browser come "http://esempio.com/articolo/ti­to­lo­pa­gi­na" il web server lo riscrive, basandosi sul mod_rewrite interno e in­vi­si­bi­le agli utenti, nell’URL dinamico "http://esempio.com/a/index.php?title=ti­to­lo­pa­gi­na". Il se­gna­po­sto (.*) e la variabile $1 cor­ri­spon­do­no in questo caso alla sequenza numerica “ti­to­lo­pa­gi­na“.   Se l’URL Rewriting deve essere collegato a opzioni spe­ci­fi­che, che regolano il com­por­ta­men­to del mod_rewrite, si annotano tra parentesi quadre dopo la Rew­ri­te­Ru­le e sono separate da virgole, qualora siano presenti più opzioni. In questo modo si possono rea­liz­za­re anche rein­di­riz­za­men­ti esterni tramite codici di stato HTTP. La tabella seguente mostra una selezione di opzioni per la Rew­ri­te­Ru­le, mentre una lista completa si trova sul sito ufficiale di Apache Software Foun­da­tion.

Opzione Flag Funzione
Redirect R La flag [R] indica al web server di eseguire un rein­di­riz­za­men­to esterno tramite codice di stato 302. Se dovesse venir inviato un altro codice, viene aggiunta alla flag il simbolo uguale (ad esempio [R=301]).
Forbidden F La flag [F] indica al web server di inviare al browser il codice di stato 403 (Forbidden).
Gone G La flag [G] indica al web server di inviare al browser il codice di stato 410 (Gone) e segnala che il sito richiesto non è più presente all’indirizzo inserito.
Last L La flag [L] indica al web server di non eseguire altri comandi dopo la Rew­ri­te­Ru­le attuale.
Nocase NC Questa flag indica che, quando si verifica se un URL rispetta le con­di­zio­ni per il rewriting, non si presta at­ten­zio­ne alle lettere maiuscole o minuscole.
Chain C La flag [C] indica di con­si­de­ra­re la Rew­ri­te­Ru­le suc­ces­si­va, solo se si verifica la con­di­zio­ne attuale.

Basandosi su un‘opzione simile, si può rea­liz­za­re un rein­di­riz­za­men­to esterno tramite un codice di stato HTTP nel modo seguente:

RewriteEngine On
RewriteRule ^vecchiapagina.html$ /nuovapagina.html [R=301]

Oltre alle Rew­ri­te­Ru­les si possono definire anche le Rew­ri­te­Conds, con le quali i webmaster sta­bi­li­sco­no le con­di­zio­ni ag­giun­ti­ve da sod­di­sfa­re affinché avvenga l’URL Rewriting.

La sintassi di una Rew­ri­te­Cond possiede la struttura mostrata di seguito e viene annotata prima della Rew­ri­te­Ru­le:

RewriteCond TESTSTRING CONDITION

La teststring contiene so­li­ta­men­te le variabili server, che sono definite dal simbolo della per­cen­tua­le e da parentesi graffe, per esempio %{HTTP_HOST}. La tabella seguente mostra una selezione di variabili server.

Variabile server Spie­ga­zio­ne
HTTP_USER_AGENT Si riferisce al client che viene uti­liz­za­to per accedere al server. La variabile viene so­li­ta­men­te uti­liz­za­ta per mettere a di­spo­si­zio­ne dei diversi browser il cor­ri­spon­den­te sito ot­ti­miz­za­to.
HTTP_HOST Si riferisce ai nomi host, che possono com­pren­de­re valori come dominio.com, sot­to­do­mi­nio.dominio.com o l’indirizzo IP.
SERVER_PORT Si riferisce alle porte richieste (ad esempio 80 per quella HTTP o 443 per quella HTTPS). La variabile consente ai webmaster di rein­di­riz­za­re i vi­si­ta­to­ri su una con­nes­sio­ne sicura.
REMOTE_ADDR Si riferisce all’indirizzo IP del web server dell’utente che richiede la pagina. Questa variabile viene anche usata per bloccare gli attacchi spam.

L’esempio seguente indica una Rew­ri­te­Cond, che collega una Rew­ri­te­Ru­le suc­ces­si­va all’indirizzo IP dell’utente che richiede la pagina:

RewriteCond %{REMOTE_ADDR} 173.45.68.79

L’URL Rewriting su nginx

Anche il web server nginx supporta già di suo l’URL Rewriting, rea­liz­za­to sempre ser­ven­do­si di espres­sio­ni regolari. Per ri­scri­ve­re gli URL, viene aggiunto il comando rewriting cor­ri­spon­den­te nella sintassi nginx in un blocco { [...] } nel file di con­fi­gu­ra­zio­ne del web server /etc/nginx/nginx.conf:

location /articolo {
 rewrite ^/articolo/(.*)$ /index.php?title=$1 last;
}

 Con location/articolo i webmaster sta­bi­li­sco­no che l’URL Rewriting si riferisce alla sot­to­car­tel­la articolo. Le espres­sio­ni regolari per il rewriting cor­ri­spon­do­no a quelle in uso sul web server Apache e vengono in­tro­dot­te dal comando rewrite. La flag last indica che il rewriting deve avvenire in­ter­na­men­te e senza rein­di­riz­za­men­to. In al­ter­na­ti­va sono messe a di­spo­si­zio­ne le flag per un rein­di­riz­za­men­to tem­po­ra­neo o per­ma­nen­te:

Flag Spie­ga­zio­ne
last Gli URL vengono riscritti in­ter­na­men­te e non si verifica alcun rein­di­riz­za­men­to.
redirect L’utente viene rein­di­riz­za­to tem­po­ra­nea­men­te al nuovo URL tramite Redirect 302.
permanent L’utente viene rein­di­riz­za­to per­ma­nen­te­men­te al nuovo URL tramite Redirect 301.

Se non viene impostata alcuna flag, il web server nginx re­sti­tui­sce au­to­ma­ti­ca­men­te il codice HTTP di errore 500.

Il rewrite su lighttpd

Nel web server lighttpd si realizza l’URL Rewriting grazie alla funzione url.rewrite-TYPE. Al se­gna­po­sto TYPE cor­ri­spon­do­no diversi tipi di con­fi­gu­ra­zio­ne per il rewriting:

Tipi di con­fi­gu­ra­zio­ne per il rewriting Spie­ga­zio­ne
url.rewrite-once L‘URL Rewriting avviene una sola volta. Se è stato trovato lo schema di ricerca e riscritto l’URL secondo lo schema di de­sti­na­zio­ne, non si ve­ri­fi­ca­no altri rein­di­riz­za­men­ti.
url.rewrite-repeat Al contrario di url.rewrite-once, con url.rewrite-repeat possono ve­ri­fi­car­si altri rein­di­riz­za­men­ti dopo il primo.

La sintassi riprende es­sen­zial­men­te il classico schema, in quanto anche su lighttpd ricorrono le stesse espres­sio­ni regolari come sul web server Apache:

url.rewrite-once = (
 "^/articolo/(.*)$" => "/index.php?title=$1"
)

Se al posto di un rein­di­riz­za­men­to interno, deve avvenirne uno esterno, su lighttpd non viene uti­liz­za­to il modulo rewriting, ma un modulo di redirect, anche se gli URL at­tra­ver­sa­no prima il modulo rewrite e poi quello di redirect.

Il rewrite su Microsoft IIS

La piat­ta­for­ma Microsoft Internet In­for­ma­tion Services (IIS) non ha già a di­spo­si­zio­ne un rewrite engine, ma si può ag­giun­ge­re suc­ces­si­va­men­te il Modulo IIS URL Rewrite 2.0. Così anche gli utenti di Microsoft possono mettere a di­spo­si­zio­ne dei loro vi­si­ta­to­ri URL più intuitivi senza dover operare sulla gestione dei file interna. L’esten­sio­ne per l’URL Rewriting, dopo essere stata scaricata, si integra di­ret­ta­men­te nell’in­ter­fac­cia IIS Manager, dove le Rew­ri­tin­gRu­les vengono inserite tramite un’in­ter­fac­cia utente grafica. Anche IIS URL Rewrite 2.0 utilizza espres­sio­ni regolari per definire lo schema di ricerca e di de­sti­na­zio­ne degli URL.

L‘URL Rewriting e l’ot­ti­miz­za­zio­ne per i motori di ricerca

Si discute delle funzioni del mod_rewrite e delle sue cor­ri­spon­den­ti rea­liz­za­zio­ni negli altri sistemi di web server anche in relazione all’ot­ti­miz­za­zio­ne per i motori di ricerca, in quanto gli URL classici possono essere riscritti in URL più intuitivi e user-friendly. Al centro della di­scus­sio­ne è il fatto se gli URL user-friendly rientrino tra i fattori di ranking valutati dai motori di ricerca. Tuttavia, non ci sono ancora prove concrete di una diretta relazione, ma si presume che i webmaster traggano vantaggio da alcuni effetti indiretti. Al contrario dei parametri criptici, gli URL riscritti per­met­to­no agli utenti di capire dove porti un link. Il rewriting può essere così uti­liz­za­to per co­struir­si un’immagine af­fi­da­bi­le e in certi casi è re­spon­sa­bi­le dell’aumento del numero di click. Inoltre le parole chiave negli URL vengono evi­den­zia­ti in grassetto nelle SERPs, cosa che può spingere a cliccare su quel risultato piuttosto che su un altro.

Vai al menu prin­ci­pa­le