Htaccess: riscrittura degli url e altre semplici funzioni

Htaccess: il file senza nome, in quanto ha solo l'estensione preceduta dal punto
Htaccess e istruzioni al server

Htaccess è un file di configurazione disponibile sul webserver Apache e ordina molteplici istruzioni da eseguire al server.

  1. Il file .htaccess
    1. Come crearlo
    2. Come funziona
    3. Alcune funzioni di utilizzo
  2. Riscrittura degli URL
    1. Attivare mod_rewrite
    2. Il significato dei caratteri
    3. Flag
  3. Url con WWW
  4. Senza WWW
  5. Occultare il nome della directory nell'url
  6. Directory protetta da password
  7. Htpasswd Generator Tool
  8. Vietare l'accesso a ip dannosi
  9. Gestire url inesistenti

Il file .htaccess

Il file .htaccess è un file senza nome, dotato solo di estensione preceduta dal punto, il file si chiama così: .htaccess

Si tratta un file di configurazione, disponibile sul web server Apache, ed è in grado di svolgere davvero tante funzioni importanti, utili a soddisfare ogni esigenza operativa, dalla sicurezza, alla personalizzazione del sito, per gestire le directory come si preferisce.

Si tratta di un file nascosto, che non è visibile, se non quando si accede al server.

Come crearlo

Se sul tuo PC non è possibile creare un file senza assegnargli un nome, non vale nemmeno la pena di toccare le impostazioni di sistema al fine di garantire una maggiore sicurezza di utilizzo del software.

È sufficiente creare un semplice file di testo, e lo si nomina htaccess.txt, una volta eseguito l'upload sul server Apache, lo puoi rinominare in .htaccess

Occorre avere un'esperienza di programmazione sufficiente con un linguaggio dinamico (come PHP), per avventurarsi nell'utilizzo del file in oggetto; è Voodoo.

Come funziona

Occorre che sia abilitata la funzione specifica che permette al file di funzionare, solitamente è attiva su di ogni sistema Apache, a meno che non siano stati compilati correttamente i moduli durante l'avvio del server.

Comunque può dipendere anche dall'hosting, molto spesso questa funzione è già abilitata, altre volte no, in quanto un uso improprio del file potrebbe creare dei loop infiniti, mandando in tilt l'intero server.

Per funzionare, il CHMOD (questo) deve avere i permessi di tipo 644, ovvero la lettura per chiunque, e la scrittura solo per il proprietario.

L'attivazione della funzione del file, la può comunque attivare il tuo hosting, se già non lo è, poi, il file, lo gestisci tu.

Alcune funzioni per cui è usato

Alcune delle funzioni maggiormente utilizzate con questo file, sono la riscrittura degli url (mod rewrite) nei siti dinamici, il redirect, come 404 ad una pagina personalizzata degli url che non esistono.

301 reindirizzamento permanente, o ancora la creazione di directory protette da password, o impedire a determinati indirizzi IP di spam robots l'accesso all'intero sito.

Oppure vietare ad alcuni spider dei motori di ricerca l'accesso in determinate directory, o file (sebbene quest'ultima operazione può essere fatta con il file robots.txt).

La scrittura del codice di .htaccess può essere semplice, o piuttosto, o molto, complessa; per molti è ancora un mistero, soprattutto quando il codice è davvero tanto, e per diverse direttive.

Può essere utilizzato sia nella root principale del sito che, secondo le esigenze, nelle diverse sottodirectory. Passiamo a qualche esempio pratico.

Riscrittura degli URL con il file .htaccess

Ammettiamo di avere un sito dinamico, che utilizza PHP (con la pagina index.php), con indirizzi del tipo:

http://www.example.com/index.php?prodotti=detergenti

e lo volessimo trasformare in:

http://www.example.com/prodotti/detergenti.html

Da un punto di vista estetico, e pratico, è certo più funzionale, anche per i motori di ricerca che vedono un URL ordinato e chiaro, invece di passaggi di parametri talvolta intricati.

Vero è che gli spider dei motori si spingono anche a tali url, ma se facilitiamo il compito, è certamente meglio, tuttavia il risultato estetico dimostra come anche la cura degli URL sia presa in giusta considerazione dal responsabile del sito, in quanto risulta chiaro ed esplicativo.

Attivare mod_rewrite

Innanzitutto occorre attivare dal file il mod_rewrite, l'istruzione che poi permette di riscrivere gli URL:


RewriteEngine On
RewriteRule ^(.*)/$ index.php?iduno=$1 [L]

Per essere più precisi:

<IfModule mod_rewrite.c>
RewriteEngine On
# codice da inserire
</IfModule>

Praticamente, il codice istruisce di applicare determinate regole e condizioni, se il mod_rewrite.c è attivato; funziona comunque anche senza questa specifica, comunque c'è ed è giusto fare le cose il più possibile precise.

Il significato dei caratteri

Il carattere cancelletto # precede tutto ciò che nella riga non appartiene al codice, ma solamente una dicitura che può tornare utile al programmatore, per indicare quale codice serve a cosa, specialmente se il codice diventa tanto, è bene ricordarsi quando lo si consulta.

^ si trova all'inizio dell'URL;

$ alla fine dell'URL.

La fine dell'URL, la prima parte della riga che termina appunto con il simbolo del dollaro; ma nella seconda parte della riga, dove troviamo $1 questa è una variabile, un parametro inviato, il passaggio di parametri che in URL non riscritti, è quello con il punto interrogativo, come in questo esempio:

index.php?prodotti=detergenti

Il punto . indica un qualsiasi carattere, mentre l'asterisco * qualsiasi carattere che sia presente, oppure no.

Nell'esempio sopra, troviamo poi .html che indica di assegnare questa estensione al nuovo indirizzo URL. Invece che html, potrebbe essere php, htm, et cetera.

Flag

La lettera, o eventualmente anche più di una, che si trovano alla fine delle righe di codice nelle parentesi quadre, si chiamano flag.

L indica che se la regola (Rule) corrisponde, di non proseguire oltre con eventuali successive istruzioni.

Escludendo la prima riga di codice (RewriteEngine On) che inizializza il mod_rewrite, con una sola riga di codice il vecchio URL:

http://www.example.com/index.php?prodotti=detergenti

è stato riscritto in:

http://www.example.com/prodotti/detergenti.html

In questo esempio, è illustrato come riscrivere gli URL in modo che sia interpretato dal motore di ricerca come: sito web: → example.comdirectory: prodotti/pagina nella directory: detergenti.html

Diverse ed opportune richieste, ovviamente vanno fatte in PHP nel file (di questo esempio) index.php per gestire le interrogazioni al database, che scaturiscono dai parametri, che arrivano dall'URL, ovvero: prodotti e detergenti.

La riga di codice cui sopra, abbiamo visto che è in grado di gestire, di riscrivere l'URL purché termini con l'estensione .html, così com'è non è in grado di gestire un URL del tipo:

http://www.example.com/prodotti/

ovvero un classico indirizzo di directory, che termina con lo slash.

Aggiungendo anche questa riga di codice:

RewriteRule ^(.*)/$ index.php?id=$1 [L]

siamo in grado di gestire l'URL anche come fosse una directory, ovvero:

http://www.example.com/prodotti/

dove è logico che quando l'URL si comporta come una directory, vengano elencati (in questo esempio), nella directory prodotti, i detergenti, etc.

Direttiva di utilizzo dell'URL con WWW con il file .htaccess

Sovente, un sito web, funziona sia con WWW che senza, ovvero funziona normalmente sia come

http://www.example.com

che come

http://example.com

Questo potrebbe creare, specialmente in siti dinamici, la possibilità di creare duplicati, ovvero tutte le pagine del sito che potrebbero, possono, essere raggiunte sia quando è presente il prefisso WWW (World Wide Web), sia quando manca.

Ecco che quando occorre stabilire che i motori di ricerca debbano utilizzare, per quanto riguarda un sito, univoci URL, possiamo impiegare questo codice per forzare il WWW, anche quando questo mancasse:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule %(.*)$ http://www.example.com/$1 [L,R=301]

Con le righe di codice sopra, forziamo, obblighiamo gli URL ad avere il prefisso WWW, e se non dovesse esserci, verrebbe automaticamente aggiunto.

Notiamo anche i flag: NC non fa caso che vi siano caratteri in maiuscolo o minuscolo, mentre R 301 è chiaramente un redirect 301, che significa cioè che il vecchio URL (in questo caso quello senza WWW) non è piè disponibile, e si viene reindirizzati a quello nuovo (con WWW).

Il Redirect 301 è di estrema importanza, quando si deve cambiare URL a pagine web che hanno cambiato indirizzo; in questo modo si evitano eventuali problemi di indicizzazione con i motori di ricerca, in quanto potrebbero tenere indicizzate sia pagine che sono state spostate (quindi errore 404, File Not Found) che quelle nuove.

Togliere il prefisso WWW

Con il codice sotto invece, è possibile ottenere il contrario, ovvero togliere il prefisso WWW e lasciare solo

http://

RewriteEngine On
RewriteCond %{HTTP_HOST} !^example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

Occultare il nome della directory nell'URL con il file .htaccess

Non lasciarti ingannare dal verbo occultare: non c'è trucco e non c'è inganno.

Immaginiamo di avere nel nostro sito dinamico, la pagina index e poi una directory che si chiama articoli; stando agli esempi cui sopra, alla riscrittura degli URL l'indirizzo sarebbe qualcosa di molto simile:

http://www.example.com/articoli/prodotti/detergenti.html

la dicitura articoli, potrebbe anche risultare di troppo, essere ridondante, specialmente se si sviluppano URL di una certa lunghezza, magari per dividere il sito con struttura di categorie e sottocategorie e pagine.

Questo è uno stratagemma utilizzato anche in diversi forum, dove non tutti hanno necessità di riportare nell'URL anche la dicitura forum, soprattutto dove potrebbe diventare un indirizzo piuttosto lungo, forse troppo. Allora, invece di:

example.com/forum/topic/post-dal-titolo--molto-descrittivo.html

si ha:

example.com//topic/post.html

Il forum è comunque presente e funzionante, ma viene semplicemente omesso dall'URL il nome forum.

Nell'esempio l'URL è tutto sommato corto, comunque anche qualche carattere in meno talvolta può tornare utile.

Con il codice qui sotto, pur continuando a utilizzare la directory denominata articoli nell'esempio, potremmo togliere dall'URL il nome della directory, quindi invece di:

http://www.example.com/articoli/prodotti/detergenti.html

avremo

http://www.example.com/prodotti/detergenti.html

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/articoli/
RewriteRule ^(.*)$ /articoli/$1

Ricordiamo che l'istruzione RewriteEngine On deve essere inserita una sola volta all'inizio del file &#46htaccess

Il codice sopra, deve essere inserito nel file della root principale del sito.

RewriteBase / è una direttiva che specifica il prefisso dell'URL da adottare, e deve essere inserita nel file presente nella root principale del sito.

RewriteCond %{REQUEST_FILENAME} !-f indica di non includere nella riscrittura degli URL di file che esistono, che sono presenti fisicamente sul server.

RewriteCond %{REQUEST_FILENAME} !-d indica di non includere nella riscrittura degli URL di directory che esistono.

Praticamente, queste due condizioni, impongono di reindirizzare gli URL verso file e directory che non esistono. In parole povere se un file od una directory esistono, in quanto fisicamente presenti sul server, devono essere raggiunti, altrimenti non sarebbero presenti.

Vietare l'accesso a IP dannosi con il file .htaccess

Se si desidera bloccare l'accesso a determinati indirizzi IP perché ad esempio associati a spam engines, possiamo farlo con il seguente codice:

Order Allow,Deny
Deny from ip_spam_1
Allow from all

Dove ovviamente ip_spam_1 è da sostituire con l'indirizzo IP che si intende bloccare.

Occorre fare attenzione, essere certi che l'IP che si intende escludere, sia davvero potenzialmente dannoso, in caso contrario, andremmo a vietare l'accesso a tutto il sito ad un IP amico.

Gestire URL inesistenti con il file .htaccess

Tra le tante cose, è anche possibile gestire gli URL inesistenti o non raggiungibili.

Questa è una delle prerogative più classiche cui .htaccess è chiamato a svolgere.

Grazie ai codici di stato HTTP (guarda l'elenco), è possibile dare indicazione precisa, al motore di ricerca, o all'utente, del perché un determinato URL non viene trovato.

Presumiamo che i seguenti file (personalizzati), li andiamo ad inserire nella directory denominata errori.

Il codice:

RewriteEngine on
ErrorDocument 400 /errori/badrequest.html
ErrorDocument 401 /errori/unauthorized.html
ErrorDocument 403 /errori/forbidden.html
ErrorDocument 404 /errori/notfound.html
ErrorDocument 500 /errori/servererror.html

Questo è il link ufficiale della documentazione mod_rewrite:

Apache Module mod_rewrite read about.

Anche questo sito, può essere utile per comprendere meglio: What is .htaccess? take a look