• Autor: Franz Neumeier
  • Datum: 1. Januar 2010
  • Kategorie: htaccess, PHP

Hotlinking selektiv verhindern

Ich möchte Hotlinking auf einzelne, ganz bestimmte Dateien von außen verhindern, ohne aber legitime Downloads und Suchmaschinen-Crawler-Zugriffe zu gefährden. Die Standard-Lösung gegen Hotlinking per .htaccess per Referrer alle Zugriffe auf alle File mit definierter Dateiendung zu blockieren, ist daher unpraktikabel. Was also tun?

Der konkrete Fall: Ich biete ein PDF kostenlos zum Download an. Aber wenn ich meine Arbeit schon kostenlos unter die Leute bringe, will ich wenigstens einen Nutzen daraus ziehen. Deshalb sollen externe Links auf eine Download-Seite bei mir geführt werden, von der aus der Download des PDFs stattfindet. Denn natürlich will ich das PDF dazu nutzen, zusätzliche Links zu meiner Site zu fördern und um neue User anzusprechen – das klappt nunmal besser, wenn die Leute meine komplette Website statt nur ein einzelnes PDF sehen.

Meine Lösung des Problems sieht in der Praxis so aus:

Der folgende Link (= von hier aus gesehen ein externer Hotlink) führt über einen Zwischenschritt zur Download-Seite statt direkt zur PDF-Datei: externer Hotlink auf das PDF

Klickt man dagegen auf den Download-Link auf der Downloadseite bei cruisetricks.de (Der inoffizielle Guide – Oasis of the Seas Kabinen & Suiten), bekommt man das PDF direkt ausgeliefert.

Wie verhindert man Hotlinking selektiv?

Zu Bilder-Hotlinking gibt es zahlreiche Anleitungen, die immer auf das gleiche unflexible Ergebnis hinauslaufen: Per .htaccess abhängig von Referrer und Dateiendung den Zugriff auf sämtliche Bilder verhindern. Das kann mal eine ganz witzige Lösung sein, um einzelne notorische Hotlinker abzuwimmeln, indem man ihnen statt des gewünschten Bildes ein bloßstellendes, falsches Bild unterjubelt. Für den beschriebenen Zweck taugt das Verfahren aber nicht. Schon weil ich damit natürlich auch die Google-Bildersuche unterminiere, die durchaus eine gute Traffic-Quelle sein kann.

Einen schönen Ansatz habe ich aber bei A List Apart gefunden („Smart Image Hotlinking Prevention„), den ich für meinen PDF-Fall nur leicht modifizieren mußte. Die Grundidee ist, den PDF-Download nur zuzulassen, wenn der Referrer meine eigene Site ist oder – sicherheitshalber – wenn gar kein Referrer übergeben wird. Letzteres stellt sicher, dass Suchmaschinen-Crawler das PDF direkt ansprechen können und User, deren Browser aus irgend einem Grund keinen Referrer mitsendet, nicht komplett vom Download ausgeschlossen sind.

Der finale Redirect auf die Landing-/Download-Seite findet dabei nicht in der .htaccess statt, sondern wird über ein kleines PHP-Skript, über selbiges die angefragte Datei flexibel ausgeliefert werden kann.
{code}
# prevent hotlinking of pdf files
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*pdf$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !cruisetricks\.de [NC]
RewriteRule (.*) http://www.cruisetricks.de/redirect.php?pdf=$1 [L]
{/code}
1) Wir beschränken die Operation auf die Dateiendung .pdf

2) Wir wenden das Rewrite nur an, der Referrer weder leer ist noch von crusietricks.de (der eigenen Domain) stammt.

3) Wir leiden die Anfrage an das PHP-Skript weiter und übergeben die angefragte Datei als Parameter.

Der Zwischenschritt über das PHP-Skript verhindert außerdem Konflikte mit den Rewrite-Regeln von WordPress.

Das PHP-Skript leitet individuell weiter

Ich will die Ausführungen zu den Skript von A List Apart hier nicht ausführlich wiederholen, sondern nur auf die Modifikationen eingehen. Da ich in meinem Fall nicht zahlreiche Dateien automatisch umleiten will und auch nur einige wenige PDF-Files (anfänglich nur zwei) umleiten will, habe ich das List-Apart-Skript insoweit modifiziert, als ich den übergebenen Parameter (bei mir pdf, bei A List Apart pic) mit if-Anweisungen abfrage und die Weiterleitung auf die Landing-/Download-Seite per Javascript in den HTML-Output des PHP-Skripts schreibe. Also in etwa so:
{code}
<head>
<?php
if ($pdf == „cabin-guide/oasis-of-the-seas-cabin-guide_de.pdf“) {
?>

<script language=“JavaScript“>
<!–
var time = null
function move() {
window.location = ‚http://www.cruisetricks.de/oasis-of-the-seas-der-inoffizielle-kabinen-guide/‘
}
//–>
</script>

<?php
}
?>

</head>

<body onload=“timer=setTimeout(‚move()‘,3000)“>

<?php
if ($pdf == „cabin-guide/oasis-of-the-seas-cabin-guide_de.pdf“) {
?>

<p>Du wirst weitergeleitet.</p>

<?php
}
?>

</body>
{/code}
Für meinen Zweck tut es das, für umfangreichere Anwendungsfälle gibt es aber sicherlich auch elegantere Lösungen.

Die Javascript-Weiterleitung ist insofern wichtig, als ich damit nicht riskiere, dass Google einen 301-Redirect von der (tatsächlich ja existierenden) PDF-Datei auf die Download-Seite sieht und damit statt des PDFs die Landingpage indiziert. Zugegeben hat dieser Gedankengang leichte Schwächen, aber eine perfekte Lösung sehe ich für das Problem nicht. Im Idealfall wird Google den Javascript-Redirect nie sehen, weil hoffentlich alle Webmaster, die direkt auf das PDF linken diesen Link ausprobieren, merken dass es nicht funktioniert und den Link auf ihrer Seite gleich in einen Link zur Download-Seite ändern. Oder sie versehen den Link nach guter deutscher Wir-verlinken-nicht-Strategie gleich mit einem rel=“nofollow“

Tags: , , , , , ,

Keine Kommentare möglich.

© 2020 Franz Neumeier's "Ceterum Censeo" Blog. Alle Rechte vorbehalten.

Powered by Wordpress and Magatheme by Bryan Helmig.