In questo articolo parleremo di URL Rewrite, utilizzando il mod_rewrite in htaccess.
Nella scorsa lezione abbiamo già visto come effettuare un redirect 301, ma se si ha l’esigenza di reindirizzare in modo definitivo le richieste da un vecchio dominio verso uno nuovo, è più corretto utilizzare il mod_rewrite.
Trovate la documentazione ufficiale al seguente link: mod_rewrite.
Questo modulo lo trovate già installato nei servizi di hosting.
Però è consigliabile utilizzare il blocco If Module mod_rewrite.c così, se per qualsiasi motivo il modulo non dovesse essere attivo, il codice digitato all’interno non viene considerato.
URL rewrite esempi
Facciamo quindi un esempio di URL Rewriting.
Supponiamo quindi di voler reindirizzare il vecchio sito alla nuova URL: www.nuovaurl.it.
Innanzitutto inseriamo il blocco If Module mod_rewrite.c e all’interno specifichiamo di attivare il RewriteEngineimpostandolo ad On.
RewriteBasedefinisce il percorso di base da applicare alle regole di riscrittura.
Dopo inseriamo la RewriteRule, in cui specifichiamo l’URL Rewriting utilizzando le espressioni regolari (“regular expressions”, Regex).
Quindi RewriteRule definisce le regole di riscrittura, la forma dell’URL, i flag come lo status code HTTP da restituire, ed altri parametri.
Così tutte le richieste dell’intero sito web saranno reindirizzate verso la nuovaurl specificata.
Possiamo anche utilizzare il RewriteCond, ad esempio chiedendo che tutto il traffico che non arriva al nuovo dominio è reindirizzato comunque sul nuovo dominio.
Quindi utilizzo RewriteCond per impostare le condizioni da esaminare prima dell’applicazione di una regola di riscrittura.
Analizziamo quindi alcune espressioni regolari utilizzate nell’esempio sopra:
Espressioni regolari
Spiegazione
^
Sta ad indicare l’inizio di una stringa.
$
Indica la fine di una stringa.
(.*)
L’asterisco indica una sequenza numerica qualsiasi in un URL. Le parentesi salvano la sequenza numerica in una variabile.
$1
Rappresenta una variabile che consente di accedere ai valori memorizzati temporaneamente, salvati utilizzando le parentesi.
?
Indica 0 o 1 istanze di uno o una sequenza di caratteri.
.
Indica un carattere qualsiasi.
*
Indica 0 o N istanze di uno o una sequenza di caratteri.
\
Il backslash è utilizzato sia come carattere di escaping, sia per specificare abbreviazioni di sequenze di caratteri.
Vediamo anche il significato dei flag specificati dentro le parentesi quadre.
Flag:
R – Redirect – [R] indica al web server di eseguire un re-indirizzamento esterno di default tramite codice di stato 302. Quindi se dovesse venir inviato un altro codice, dobbiamo aggiungerlo: ad esempio [R=301].
F – Forbidden – [F] indica al web server di inviare al browser il codice di stato 403, cioè Forbidden. Indica dunque un accesso proibito.
G – Gone – [G] indica al web server di inviare al browser il codice di stato 410, Gone. Inoltre segnala che il sito richiesto non è più presente all’indirizzo inserito.
L – Last – [L] indica al web server di non eseguire altri comandi dopo la RewriteRule attuale. Nella maggior parte dei contesti, ciò significa che se la regola corrisponde allora non verranno elaborate ulteriori regole.
NC – Nocase – [NC] Indica di non prestare attenzione alle lettere maiuscole o minuscole, quando un URL rispetta le condizioni per il rewriting.
C – Chain – [C] indica di considerare la RewriteRule successiva, solo se si verifica la condizione attuale.
Riscrivere un URL dinamico
Supponiamo adesso di riscrivere un URL dinamico, come ad esempio questo: http://www.miodominio.it/a/prodotti.php?categoria=miacategoria
in un URL statico come questo: http://www.miodominio.it/categoria/miacategoria.
Ecco dunque il codice d’esempio:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/categoria/(.*)$ /a/prodotti.php?categoria=$1
</IfModule>
Cioè, se un utente inserisce l’URL statico http://www.miodominio.it/categoria/miacategoria, il web server lo riscrive grazie a quanto specificato nel mod_rewrite (gli utenti non lo vedono) in http://www.miodominio.it/a/prodotti.php?categoria=miacategoria.
URL Rewriting da non www a www
Facciamo adesso un altro esempio di re-indirizzamento dagli URL senza www alla versione con www:
In questo articolo parleremo di redirect 301 e dunque di come impostare il redirect di un sito web dal file .htaccess.
Redirect 301 in dettaglio
Il codice 301 è un codice di stato del protocollo http che indica al client, che ha effettuato la richiesta al server, che la pagina è stata spostata in maniera definitiva.
Il codice di stato 302 del protocollo http indica invece che lo spostamento della pagina è provvisorio.
Quindi con il codice 301 il server comunica al client che la pagina web non si trova più, in maniera definitiva e permanente, al link originale.
Il motore di ricerca in questo modo ha le informazioni necessarie per modificare il proprio database, aggiornando la nuova URL e gli indici che indicano la nuova posizione della URL nelle SERP.
Pertanto gestire correttamente i redirect è un’operazione importante per la SEO, altrimenti il sito non viene indicizzato correttamente.
Quindi quando, per qualsiasi motivo, il sito deve essere spostato in maniera permanente e definitiva devo usare il redirect 301.
In questo modo si evita anche l’errore 404 ovvero pagina non trovata.
Ci sono vari modi per realizzare un redirect 301, vi ricordo infatti che si può fare semplicemente utilizzando il codice php.
htaccess directory – In questa lezione vedremo come limitare o consentire l’accesso solo ad alcune directory, sotto-directory, ad un singolo file o ad un gruppo di file.
Nella scorsa lezione abbiamo utilizzato le direttive limit, order, deny, allow per limitare o permettere l’accesso ad un sito web da parte di alcuni domini o indirizzi ip.
Adesso utilizzeremo ancora queste direttive per limitare gli accessi ai contenuti del nostro sito web, tramite il file htaccess.
htaccess directory – Bloccare l’accesso ad una directory
Per limitare l’accesso alla directory con htaccess utilizzo il blocco <directory> e all’interno inserisco le specifiche da seguire.
Facciamo dunque un semplice esempio:
<Directory /nome-cartella/*>
Order deny,allow
Deny from all
</Directory>
Chiaramente sostituite nome-cartella con il nome della vostra cartella.
Con questo codice sto definendo innanzitutto l’ordine di inserimento delle nostre istruzioni: prima deny e poi allow. Poi blocco l’accesso a tutto il contenuto della cartella, l’asterisco infatti estende il blocco a tutti i file e alle sotto-cartelle.
Quindi ad esempio se digito www.nome-sito.it/nome-cartella i contenuti all’interno della cartella non sono visibili a nessuno.
Bloccare l’accesso ad un file
Possiamo decidere anche di bloccare un solo file all’interno di una cartella. Ad esempio posso proteggere un ipotetico file password.php che contiene informazioni riservate. Per fare ciò utilizzo il blocco <Files>.
<Files password.php>
Order deny,allow
Deny from all
</Files>
Il codice sopra impedisce a tutti di accedere al file password.php e di leggerne o scaricarne il contenuto.
Bloccare l’accesso ad alcuni tipi di file
Posso anche bloccare una serie di file. Ad esempio decido di bloccare i file che hanno estensione pdf, ico o mp4. Per fare questo devo utilizzare il blocco <FilesMatch>.
<FilesMatch \.(ico|pdf|mp4)>
Order deny,allow
Deny from all
</FilesMatch>
Il codice qui sopra impedisce a chiunque, (Deny from all) l’accesso ai file che finiscono con .ico oppure .pdf oppure .mp4.
Chiaramente anche qui potete modificare le estensioni in base alle vostre esigenze.
Infatti un classico utilizzo è nel limitare gli accessi ai file con estensione .inc oppure .conf, cioè le estensioni dei file di configurazione.
Inoltre posso anche aggiungere chi invece può accedere ai file.
<FilesMatch \.(inc|.conf)>
Order allow,deny
Deny from all
Allow from 123.123.123.123
</FilesMatch>
Chiaramente cambiate l’indirizzo IP con quello desiderato.
Ma attenzione se non si ha un indirizzo IP statico non ha senso adottare questa soluzione.
Si può in tal caso ricorrere alla sintassi CIDR indicando ad esempio:
Allow from 123.123.123.0/16
oppure:
Allow from 123.123.0/16
In modo da raggruppare un intervallo di indirizzi.
htaccess (Hypertext Access) – In questa lezione vedremo come configurare il file .htaccess per specificare le direttive di Apache. Infatti quando il web server riceve una richiesta, come ad esempio il caricamento di una pagina web, verifica se è presente un file .htaccess.
Questo file di solito si trova nella directory principale del sito web e può contenere varie indicazioni.
Il file .htaccess non è altro che un file di testo quindi si può modificare semplicemente con il blocco notes.
La documentazione ufficiale di Apache inerente i file htaccess la trovare al link: Apache htaccess.
Ecco quindi alcune delle indicazioni più comuni che è possibile dare:
– Limitareaccessialle cartelle
– Impostare il redirectdi un sito web
– Gestire l’URL rewriting
– Attivare il caching delle immagini
– Gestire le compressioni Gzip
– Proteggere le immagini dall’hot-linking
– Gestire pagine di errore personalizzate
– Configurare PHP
Vediamo in dettaglio i vari punti specificati sopra.
Limitare accessi alle cartelle con htaccess
Può essere utile limitare gli accessi a tutto il sito o ad una o più cartelle o sotto cartelle del nostro sito web. Ad esempio per bloccare bot e visite indesiderate.
Quindi potremmo proprio utilizzare le direttive di Apache per controllare l’accesso non autorizzato a tali cartelle.
Dobbiamo quindi accedere al nostro file htaccess, cliccare con il tasto destro e modificarlo utilizzando delle direttive.
Le direttive che in questo caso ci serviranno sono:
– Limit
– Deny/Allow
– Order
Quindi facciamo degli esempi di utilizzo:
<Limit GET HEAD OPTIONS POST PUT>
Order Allow,Deny
Allow from All
Deny from 123.123.123.123
</Limit>
Con questo codice sto bloccando le visite dall’indirizzo IP specificato.
Infatti abbiamo innanzitutto impostato la direttiva limit per tutte le chiamate GET, HEAD, OPTIONS, POST e PUT.
Poi abbiamo definito l’ordine di inserimento delle nostre istruzioni: prima allowe poi deny.
Quindi prima con allowpermettiamo l’accesso a tutti (ALL) e poi con deny neghiamo l’accesso ad un determinato indirizzo ip.
N-B. Si possono inserire anche più istruzioni deny di seguito.
Facciamo ancora un altro esempio:
<Limit GET HEAD OPTIONS POST PUT>
order deny, allow
deny from all
allow from .dominimo-ok.com
</Limit>
In questo caso sto bloccando tutte le visite tranne quelle del dominio specificato. Potrei inserire al posto del nome di dominio anche un indirizzo ip. Inoltre si possono inserire anche più istruzioni allow di seguito.
Nella prossima lezione vedremo come limitare l’accesso solo a determinati file o cartelle.