url rewriting tramite htaccess

La URL rewriting è sicuramente una delle più potenti procedure di “manipolazione” degli indirizzi delle pagine web.

Il “Rewrite Engine”

Il Rewrite Engine è un modulo reso disponibile dai Web Server Apache.

Il Rewrite Engine è un tipo di parser in grado di interpretare direttive più o meno complesse. Operativamente si tratta di un modulo che deve essere precaricato sul Web Server. Ad esso ci si riferisce anche con il nome di “mod_rewrite”.

Le istruzioni interpretate dal modulo sono codificate in uno o più file di testo denominati “.htaccess”.
Le istruzioni di riscrittura possono contenere 4 direttive:

  • RewriteEngine: è necessario settarlo come “on” per poter attivare le funzionalità di rewriting;
  • RewriteBase: definisce il percorso di base da applicare alle regole di riscrittura;
  • RewriteCond: serve ad impostare le condizioni da esaminare prima dell’applicazione di una regola di riscrittura;
  • RewriteRule: definisce le regole di riscrittura, la forma delle URL, lo status code HTTP da restituire e altri parametri impostabili.

Come si riscrive una URL?

La classica regola di riscrittura della URL è così composta:

RewriteRule Pattern Substitution [OptionalFlags]

dove:

RewriteRule il nome della direttiva.

Pattern è l’espressione regolare applicata alla URL corrente. Le espressioni regolari non sono altro che sintassi attraverso le quali si possono rappresentare insiemi di stringhe. Sono utilizzate per riconoscere una URL intera o una porzione di essa.

Substitution è la stringa utilizzata per generare la trasformazione della URL corrente. In questa stringa è anche possibile richiamare delle variabili speciali attraverso la sintassi %{NOMEVARIABILE}.

OptionalFlags è un elenco di parametri opzionali. Quando specificati, i parametri sono racchiusi tra parentesi quadre e sono separati da virgola. Alcuni tra i più comuni sono qui riportati:

  • “F”: accesso proibito (che genera un errore 403 sul client)
  • “L”: ultima regola da interpretare
  • “NC”: attiva il matching case-insensitive
  • “R=code”: il client sarà rediretto alla URL costruita nel campo Substitution come ad esempio nel caso “[R=301]” che corrisponde alla regola del redirect 301. Se non è specificato un codice numerico, il codice di ritorno “di default” è il 302, ovvero il redirect temporaneo.

Espressioni regolari

Per gestire in modo corretto la riscrittura degli URL è consigliabile avere la dimestichezza con la sintassi delle espressioni regolari.

Corrispondenza esatta e meta-caratteri

I caratteri che compongono una stringa esprimono una corrispondenza di testo esatta.

Per la suddetta regola esiste un’eccezione che è rappresentata da alcuni simboli chiamati “meta-caratteri”, che sono: . * ? { } + ^ $ [ ] \ | ( )

I meta-caratteri sono sempre utilizzati in combinazione con altri caratteri.

Significato dei meta-caratteri

  • .” il punto indica un carattere qualsiasi
  • *” l’asterisco indica 0 o N istanze di uno o una sequenza di caratteri
  • ?” il punto interrogativo indica 0 o 1 istanze di uno o una sequenza di caratteri
  • {}” le parentesi graffe indicano il numero esatto, minimo, massimo o un intervallo di occorrenze
  • +” il simbolo di addizione indica 1 o N istanze di uno o una sequenza di caratteri
  • ^” l’apice indica l’inizio di una stringa o, se all’interno di una classe, la negazione della stessa
  • $” il dollaro indica la fine di una stringa
  • |” il “pipe” indica l’operatore OR
  • \” il backslash è utilizzato sia come carattere di escaping, sia per specificare abbreviazioni di sequenze di caratteri
  • ()” le parentesi tonde sono utilizzate per contenere una sottostringa
  • []” le parentesi quadre sono utilizzate per specificare una classe di caratteri

Esempi di configurazioni

Redirect 301 di pagine dello stesso sito web

Per eseguire un redirect 301 (o altro), è possibile ricorrere ad una direttiva semplice e sintetica:

Redirect 301 /vecchiapagina.html https://www.domimio.com/nuova-pagina.html

È possibile anche fare una redirezione tramite il codice php (in assenza di file .htaccess):

<?
Header ("HTTP/1.1 301 Moved Permanently");
Header ("Location: https://www.dominio.com/nuova-pagina.html");
?>

URL canonicalization

La canonizzazione delle URL è il processo mediante il quale viene scelta la URL migliore, quando ci sono effettivamente diverse possibilità.

Un esempio classico di canonizzazione è quello del “www” o “non www” (www.dominio.com oppure dominio.com). Poiché queste URL sono differenti, lo spider le vedranno come due siti web a se stanti (con conseguenti problemi dovuti alla duplicazione dei contenuti).

Quando il motore di ricerca “canonizza” una URL, sceglie la migliore ed elimina le altre varianti. Dobbiamo comunque essere noi a “suggerire” al motore quale versione è quella corretta.

L’espressione da usare è questa:

RewriteEngine On
RewriteCond %{HTTP_POST} !www\.dominio\.com$
RewriteRule (.*) http://www.dominio.com/$1 [R=301,L]

Questa direttiva permette di reindirizzare le richieste dirette a “http://dominio.com” su “http://www.dominio.com” e di risolvere il problema di canonicalization sul sito.

Come verificare casi di duplicazione relativi alla canonicalization

Per verificare rapidamente se Google è incorso in un problema di canonicalization sul dominio è possibile verificarlo tramite una procedura semplice.

Basta immettere questa query di ricerca su Google:

site:dominio.com

Con questa query, Google restituisce tutte le pagine indicizzate e i relativo numero complessivo.

Se si trovano riferimenti sia al nome canonico dell’host, sia al nome con “www”, potrebbe esserci un problema di duplicazione.

Trasformare le URL

Esempio #1

Con la direttiva

RewriteEngine On
RewriteRule ^prodotto-([0-9]+)\.html$ prodotto.php?id=$1 [NC]

l’URL statica “http://www.dominio.com/prodotto-12.html” è trasformata nella URL dinamica “http://www.dominio.com/prodotto.php?=id=12”.

Con questa trasformazione scompare il riferimento all’estensione “.php” e la query string è convertita in una forma statica.

Esempio #2

Con la direttiva

RewriteEngine On
RewriteRule ^files/([^/]+)/([^/]+)-(.*).html /index.php?section=$1&id=$2 [NC]

l’URL statica “http://www.dominio.com/categoria/sottocategoria/nome-della-pagina-12.html” è trasformata nella URL dinamica “http://www.dominio.com/index.php?section=sottocategoria&id=12”.

Esempio #3

La direttiva

RewriteEngine On
RewriteRule ^/categoria/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/? \/animali.php?class=$1&family=$2&hair=$3&species=$4 [PT]

riscrive le URL

  • “http://www.dominio.com/animali”
  • “http://www.dominio.com/animali/mammiferi”
  • “http://www.dominio.com/animali/mammiferi/cani”
  • “http://www.dominio.com/animali/mammiferi/cani/pelo-corto”
  • “http://www.dominio.com/animali/mammiferi/cani/pelo-corto/chihuahua”

nelle URL statiche

  • “http://www.dominio.com/animali.php”
  • “http://www.dominio.com/animali.php?class=mammiferi”
  • “http://www.dominio.com/animali.php?class=mammiferi&family=cani”
  • “http://www.dominio.com/animali.php?class=mammiferi&family=cani&hair=pelo-corto”
  • “http://www.dominio.com/animali.php?class=mammiferi&family=cani&hair=pelo-corto&species=chihuahua”

Bloccare l’hot-linking delle immagini

L’hot-linking è un “trucchetto” utilizzato nei siti web dove le pagine di un sito fanno riferimento ad oggetti che appartengono ad altri siti, quindi ad altri domini. Spesso gli hot-link sono utilizzati con immagini di grandi dimensioni hostate su altri siti web.

Questo stratagemma comporta uno stress e uno sfruttamento di banda e risorse del server su cui sono memorizzati i files.

Questo approccio, ovviamente non è gradito da chi lo subisce, perchè sottrae banda, spazio e risorse da un server che non appartiene a chi realizza l’hot-linking.

Questa direttiva consente di restituire un codice “403 Forbidden” quando qualcuno tenta di “hotlinkare” una risorsa su un nostro sito web:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?dominio.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|bmp)$ – [NC,F,L]

Redigere su un subfolder

Se per caso stiamo lavorando su una nuova versione di un sito web, magari in una cartella “new” all’interno della root, normalmente la nuova versione del sito sarebbe accessibile puntando a “http://www.dominio.com/new”.

Mediante la seguente direttiva, si rende la nuova versione del sito direttamente tramite il link “http://www.dominio.com/”, dove tutte le URL verranno riscritte automaticamente includendo il riferimento alla cartella “new”.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^dominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.dominio\.com$
RewriteCond %{REQUEST_URI} !^/new/
RewriteRule (.*) /new/$1

Bloccare gli accessi non autorizzati

Wget e HTTrack sono alcuni dei software utilizzati per “scaricare” una versione statica dei siti web.

Per bloccare gli accessi a questi determinati crawler, possiamo scrivere questa direttiva:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts
RewriteRule .* – [F,L]

Comunque, è importante ricordare che alcuni script possono falsificare la stringa User Agent identificandosi come un browser tradizionale. 😉

Aggiungere altre restrizioni di accesso

Inibire o limitare il listing

Se nella barra degli indirizzi si digita “http://www.dominio.com/sottocartella/” il Web Server potrebbe restituire l’elenco dei files contenuti all’interno.

Per evitare questa spiacevole cosa, si aggiunge all’inizio del file .htaccess la seguente direttiva:

Options -Indexes

Per evitare il listing su una directory specifica:

IndexIgnore *

Per escludere il listing solo di alcuni tipi di files:

IndexIgnore *.gif *.jpg

Check dell’indirizzo IP

Per inibire l’accesso a determinati indirizzi IP:

order allow,deny
deny from 123.45.6.7
allow from all

Check dell’HTTP referer

Per inibire gli accessi da un sito specifico:

RewriteEngine On
RewriteCond %{HTTP_REFERER} nomedominiodainibire\.com [NC]
RewriteRule .* – [F]

 

Spero che questi “trick” possano aiutarvi nella configurazione agli accessi sui vostri siti web, A presto, e fatemi sapere nei commenti! 😉

Se vuoi maggiori informazioni o una consulenza riguardo la URL rewriting htaccess, contattami tramite il form nella sidebar o tramite la pagina contatti del sito.
URL rewriting tramite htaccess. Come rendere le URL “seo friendly”.

Potrebbe anche interessarti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.