Come prevenire hotlinking con il file .htaccess

Gli hotlinking sono dei link “inline“, dei link che linkano direttamente all’oggetto, (solitamente un’immagine, un file multimediale, ma anche l’intera pagina) che si trova in una pagina di un sito esterno.

Quest’ultimo ha quindi un link inline dal primo sul quale si trova l’oggetto ed utilizza, tra l’altro, anche la sua banda di traffico. Una questione delicata quindi se si ha una determinata quantità di banda giornaliera o mensile a disposizione.

Questo potrebbe essere negativo per chi ha un photoblog o presenta sul sito delle belle foto, che vengono linkate per essere utilizzate in altri siti (senza permesso tra l’altro).

Per chi utilizza un server apache si hanno buone probabilità di bloccare gli hotlinking tramite il file .htaccess.

Nel file .htaccess si prepara una lista, in cui si indica l’indirizzo del sito o dei siti che sono autorizzati ad utilizzare gli oggetti (immagini, file, pagine) presentati sul sito in questione. Si indica quale URL è autorizzato ad utilizzare un determinato formato file (definito con l’estensione dello stesso).

Esempio: tutte le richieste dirette ai file con l’estensione .jpg dal dominio “nomedominio.com” vengono autorizzate, tutti gli altri accessi da altri domini vengono indirizzate verso un altro URL, per esempio un file immagine.

Si introduce “nomedominio.com” nella lista degli URL autorizzati, le estensioni gif,jpg,GIF,JPG nelle estensioni ammesse e l’URL per il riindirizzamento.

Si aggiungono quindi le seguenti righe nel file .htaccess che si trova nella directory root del server:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.com*$ [NC]
RewriteRule .*\.(gif|jpg|GIF|JPG)$ http://www.nomedominio.com/image.jpg [R,NC,L]

Se “RewriteEngine on” fosse già stato introdotto precedentemente, aggiungere solamente le altre righe.

Questa è un’eccezione nel file .htaccess:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.it/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.it$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?nomedominio.org$ [NC]
RewriteRule .*\.(gif|jpg|GIF|JPG)$ http://www.nomedominio.com/image.jpg [R,NC,L]

Coloro che hanno ancora hotlinking verso il sito continuano ad utilizzare banda del server (l’immagine che viene caricata), ma non potranno più utilizzare le foto!

Altra eccezione: permesso di Hotlinking dai motori di ricerca in modo che essi possano scaricare le immagini. Nella regola che segue i motori di ricerca quali Google, Yahoo, Msn e Ask vengono abilitati a scaricare le immagini del sito senza divieti.

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+\.)?nomedominio\.com [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !images.google\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !ask\. [NC]
RewriteRule \.(jpe?g|gif|bmp|png)$ - [F,NC,L]

La regola Rewrite Cond in questo caso significa “condizione per l’ammissione dell’Hotlinking”.

Il punto esclamativo “!” significa: “se non é” il mio sito o se non é Google o Ask, riscrivi la condizione di divieto per i file jpg, gif, bmp e png.

Inviare un’immagine voluta

Se poi l’indirizzo dell’immagine viene inserito direttamente nel browser si potrebbe far apparire la foto con il link al sito sotto di essa. Per far questo si deve creare un piccolo file che verrà poi richiamato in quei casi.

Il file, che chiameremo nocopy.php, lo inseriremo nella root come un semplice file php:

<?php
header("Content-type: text/html");
header("Expires: Tue, 26 Jul 2030 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0?,
false);
header("Pragma: no-cache");
$pic = strip_tags( $_GET['pic'] );
if ( ! $pic ) {
die("Non ci sono immagini!");
}
?>
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>< ?php echo($pic); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1?> </meta>
</head>

<body>
<p><img src="images/<?php echo($pic); ?/>" alt="Image"></p>
<p>Immagine del sito <a href="http://www.domain.com/" rel="nofollow"> domain.com </a>.</p>

</body>
</html>

Nel file .htaccess si inseriscono poi i seguenti comandi:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !domain\.com [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteRule (.*) /nocopy.php?pic=$1

In questo modo non è possibile fare un Hotlink all’immagine del sito e per chi apre l’immagine introducendo l’indirizzo della stessa direttamente nel browser riceverà l’immagine con sotto di essa il link al proprio sito.

Se poi si vuole far apparire un’altra foto al posto di quella Hotlinkata si deve modificare l’ultima riga del codice (in questo caso peró non si risparmia banda):

RewriteRule \.(ico|jpg|jpeg|gif|bmp|png|pdf|css)$ images/nohotlink.gif [L]

L’immagine “nohotlink.gif” é l’immagine che si vuole far apparire al posto della richiesta.

Alcuni siti possono però riportare la foto

Però si potrebbe avere la necessità che determinati siti, e non solo motori di ricerca, potrebbero ugualmente avere la possibilità di fare un hotlink alla foto del proprio sito.

In questo caso metto le seguenti righe:

RewriteCond %{HTTP_REFERER} !^http://(www\.)?sitoesterno.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?sitoesterno.com*$ [NC]

Parametri:
[NC] = Non Case sensitive
F = Restituisci errore 403 (Forbidden)
L = Last rule, cioè non leggere oltre perché questa è l’ultima regola della singola condizione del Rewrite.

Comments are Disabled