Il mod_rewrite
di Apache è un modulo che permette di riscrivere le URL a livello del server, in modo che le indecifrabili query string composte da coppie chiave=valore
vengano tradotte in URL semanticamente comprensibili. Le URL semantiche, inoltre, permettono una migliore indicizzazione delle risorse nei motori di ricerca. Grazie al mod_rewrite
è possibile reindirizzare la seguente risorsa:
http://example.com/?p=123
nell'URL:
http://example.com/il-mio-articolo-su-wordpress/
In WordPress il mod_rewrite
è indispensabile per l'impostazione dei Pretty Permalink nella pagina di configurazione dei permalink.
Questa premessa sul mod_rewrite
è necessaria in quanto il modulo permette di implementare tecniche con cui migliorare la sicurezza dell'istallazione, evitando accessi da referenti non graditi, come robot e spammer. L'avvertenza è quella di effettuare un back-up completo di tutti i file presenti sul server, compreso l'.htaccess
, prima di effettuare qualsiasi modifica.
URL rewriting
Il mod_rewrite
non permette solo di tradurre in pretty permalink un indirizzo composto da nomi di variabili e rispettivi valori, ma consente anche di verificare che siano soddisfatte delle condizioni relative al referrer da cui proviene la richiesta. Si considerino le seguenti direttive:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} example1.com [NC,OR]
RewriteCond %{HTTP_REFERER} example2.com [NC]
RewriteRule .* - [F]
</ifModule>
La sezione <IfModule>
stabilisce in presenza di quale modulo le direttive debbano essere eseguite. La prima direttiva, RewriteEngine on
, abilita il processo di runtime del modulo; RewriteCond
stabilisce la condizione, che in questo caso è la corrispondenze del referrer ad example1.com
ed example2.com
.
In parentesi quadre vengono impostati i flag, che sono comandi che alterano il comportamento della RewriteRule
. Nell'esempio appena visto, il flag NC
sta per case-insensitive e le condizoni stabilite dalle direttive RewriteCond
stabiliscono in quali circostanze debba essere eseguita la direttiva RewriteRule
. La sintassi di quest'ultima è la seguente:
RewriteRule pattern substitution [flag1,flag2,flag3]
Il pattern
è un'espressione regolare che individua una URL; la substitution
riscrive la URL individuata dal pattern (in questo caso è assente); il flag F
impone al server di restituire un errore 403 Forbidden. In questo modo potranno essere bloccate tutte le richieste provenienti dai domini individuati dalla RewriteCond
. Questi domini sono individuabili dal file di log di Apache.
Commenti spam e robots
A meno che non si utilizzino specifici plugin, come tutti i siti aperti ai commenti degli utenti anche WordPress è soggetto allo spam dei commenti. Le stesse direttive descritte in precedenza possono essere utilizzate per ridurre la fastidiosa presenza di commenti non graditi:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*example.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
Le condizioni, in questo esempio, sono più numerose, ma probabilmente altrettanto chiare. In questo caso si stabilisce che la richiesta abbia metodo POST
, che la risorsa richiesta sia il file wp-comments.php
e che la richiesta provenga da un referrer diverso dal dominio di WordPress. Una volta verificate le condizioni, la RewriteRule
reindirizza l'utente alla risorsa di provenienza e stabilisce il reindirizzamento come permanente ([L]
).
Oltre al file .htaccess
, un altro strumento per bloccare l'accesso dei robot è il file robots.txt
, il quale stabilisce a quali risorse i robot non possano accedere. Le istruzioni che seguono, inserite all'interno del file robots.txt
, negano ai robot l'accesso alle risorse specificate:
User-agent: *
Disallow: /cgi-bin/
Disallow: /feed/
Disallow: /trackback/
Disallow: /wp-admin/
Disallow: /wp-content/plugins/
Disallow: /wp-content/cache/
Disallow: /wp-content/themes/
Disallow: /wp-includes/
Disallow: /xmlrpc.php
Disallow: /wp-
Allow: /wp-content/uploads/
Sitemap: http://www.example.com/sitemap.xml
Il robot.txt rappresenta soltanto un'indicazione e non c'è garanzia che il robot obbedisca alle direttive del file.