Zur Navigation

Hotlinking mit htaccess unterbinden

1 Martin

Hallo,
ich möchte demnächst meine Bilder für Sumas und Co. in der robots.txt freigeben, aber ein Hotlinking verhindern.
Google, Bing und Pinterest sollen davon ausgenommen sein.
Ein alternatives Bild mit einem extra Hinweis muss nicht angezeigt werden.

Bei meinen Recherchen habe ich etwas unterschiedliche Codes gefunden.
Vielleicht kann mir jemand sagen, ob das alles gleich gut funktioniert oder evtl. doch Unterschiede existieren.

Hier mal ein Beispiel, bei dem mir in etwa klar ist, was welche Zeile macht:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourwebsite.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?facebook.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?twitter.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?other-websites-go-here.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [F]


a)Die 2. Zeile, eigene Domain betreffend (die noch einzusetzen ist)
Hier habe ich folgende Alternativen gefunden, bei denen die eine sich nur im https unterscheidet, die tradino-Zeile aber schon anders aussieht.

RewriteCond %{HTTP_REFERER} !^https://(www\.)?tradino-shop\.de(/.*)?$ [NC]
RewriteCond %{HTTP_REFERER} !^https://(www\.)?perun.net [NC]


b)Zeile 3-5, Sumas+Pinterest betreffend
Hier habe ich drei etwas andere Codes gefunden. Zwei unterschiedliche Versionen für Google und die Pinterest-Zeile hat vorne kein www, aber hinten ein "com" mit nur einem Punkt danach (statt zwei wie beim Google-Beispiel).

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


c) Wo in htaccess einfügen?
In meiner htaccess steht schon einiges drin (301-redirect, Browser-Caching, deflate-Komprimierung, PW-Schutz).
Wo füge ich den Code ein, am besten ganz unten?


Danke!

Martin

13.11.2019 12:38

2 Jörg Kruse

zu a)

Den Ausdruck "(/.*)?$" mit der Bedeutung "optional ein Slash mit ein oder mehreren Zeichen vor dem Ende" würde ich auch weglassen, d.h. stattdessen das Ende einfach offen lassen, wie in dem Codebeispiel von perun.net - das kommt auf das gleiche hinaus und ist kürzer

zu b)

Hier gilt das gleiche: das ".*$" am Ende ist m.E. überflüssig

zu c)

Verbote würde ich mit einem L-Flag versehen oberhalb der Redirects und sonstigen Rewrites einbauen:

https://jkip.de/howtos/mod_rewrite-reihenfolge

13.11.2019 22:57 | geändert: 13.11.2019 22:58

1 Forenmitglied fand diesen Beitrag gut

3 Martin

Hallo Jörg,
also würde das Ganze dann so aussehen:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?meinedomain.de [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC]
RewriteCond %{HTTP_REFERER} !^https://pinterest\.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?facebook.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?twitter.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [F]

Zu a) und b):
Vermute ich richtig, dass "!^http(s)?:" anstelle von "!^https:" sowohl die http als auch die https-Version abdeckt und jedenfalls nicht schaden kann? Was meine eigene Site angeht, die hat momentan noch http, aber das wird sich sicher mal ändern.
Und die anderen Ausnahmen betreffend (Google, FB, Pinterest, Twitter) könnte es wohl auch nicht schaden.

Zu b):
Warum sieht die Pinterest-Zeile anders aus, ohne das www vorne und hinten mit Slash vor dem com?

Zu c):
Meine htaccess sieht jetzt so aus:
# xmlrpc.php deaktivieren zwecks sicherheit
<Files "xmlrpc.php">
Require all denied
</Files>

# Kein Zugriff auf wp-config und Dateien mit WP-Version
<FilesMatch "(wp-config.php|liesmich.html|readme.html|liesmich.txt|readme.txt|licence.txt)">
Require all denied
</FilesMatch>

# Zusaetzlicher htaccess-PW-Schutz
<Files wp-login.php>
...
</files>

# 301-redirect: page.html zu page
RewriteRule ^([\w-]+)\.html$ http://www.domain.de/$1 [R=301,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Serverseitige deflate-Komprimierung
<IfModule mod_filter.c>
<IfModule mod_deflate.c>
...
</IfModule>
</IfModule>

# Browser-Caching durch mod_expires
<IfModule mod_expires.c>
ExpiresActive On
...
</IfModule>

Der Code müsste dann entweder gleich als Allererstes ganz oben oder spätestens direkt nach dem zusätzlichen PW-Schutz kommen, richtig?

Muss ich dann das "RewriteEngine On" noch ergänzen zu meinem hotlinking-Code?

Mit L-Flag meinst du [NC,L] statt nur [NC]?

14.11.2019 11:36

4 Jörg Kruse

Vermute ich richtig, dass "!^http(s)?:" anstelle von "!^https:" sowohl die http als auch die https-Version abdeckt und jedenfalls nicht schaden kann?

Schaden wohl nicht - es beansprucht ein klein wenig mehr Rechenzeit.

Warum sieht die Pinterest-Zeile anders aus, ohne das www vorne

Vermutlich weil derjenige, der diese Bedingung definierte, www.pinterest.com nicht als Ausnahme mit berücksichtigen wollte.

und hinten mit Slash vor dem com?

Du meinst mit Backslash vor dem Punkt :) Ein Punkt in einem Regex bezeichnet ein beliebiges Zeichen. Ein Punkt mit einem Backslash davor bezeichnet einen Punkt. Da auch der Punkt ein beliebiges Zeichen ist, funktionieren die Ausdrücke auch ohne Backslash vor dem Punkt, lassen mitunter aber auch andere, unerwünschte Muster zu. "Korrekter" ist also die Verwendung von "\." für einen Punkt

Muss ich dann das "RewriteEngine On" noch ergänzen zu meinem hotlinking-Code?

Diese Zeile wird nur einmal in der .htaccess Datei benötigt. Ich würde sie an den Anfang aller mod_rewrite Direktiven stellen.

Die oben verlinkte Empfehlung der Reihenfolge betrifft auch nur die Direktiven, die von mod_rewrite ausgeführt werden, d.h. die Direktiven, die mit "Rewrite" beginnen. Die anderen Direktiven werden unabhängig voneinander von anderen Modulen, wie mod_access, mod_deflate oder mod_expires ausgeführt. Da kann man dann eine beliebige Reihenfolge wählen, aber ich würde der Übersicht halber die Direktiven nach Modulen sortieren und mit den "wichtigen", wie z.B. mod_access, beginnen.

14.11.2019 22:59 | geändert: 14.11.2019 23:09

1 Forenmitglied fand diesen Beitrag gut

5 Martin

Warum sieht die Pinterest-Zeile anders aus, ohne das www vorne


Vermutlich weil derjenige, der diese Bedingung definierte, www.pinterest.com nicht als Ausnahme mit berücksichtigen wollte.

Doch, das sollte schon die gleiche Ausnahme sein wie bei der Google-Bildersuche, Twitter und FB, d.h., ein Hotlinking sollte erlaubt sein für Pinterest.
Also den gleichen Code machen wie für Google und den obigen vergessen?

Ist eigentlich schon mal ein kreativer Kopf auf eine Idee gekommen, was man mit der Rewrite-Rule Sinnvolles bewirken könnte, zum eigenen Vorteil? Ein alternatives belehrendes Hinweisbild meine ich nicht, sondern etwas anderes.
Eine Umleitung auf die Startseite gefiele mir schon besser, quasi echten Traffic auf eine Seite, statt nur für ein einzelnes Bild erzeugen, aber wirklich Traffic gibt das wohl nicht. Denn der Hotlinker merkt ja sofort, dass das Bild nicht erscheint und entfernt gleich wieder die src-URL auf meinen Server.

15.11.2019 01:35

6 Jörg Kruse

Ja, wenn du auch www.pinterest.com als Referrer zulassen möchtest, dann kannst du wie in den anderen Fällen das optionale "(www\.)?" vor den Domainnamen setzen.

Eine Umleitung auf die Startseite gefiele mir schon besser, quasi echten Traffic auf eine Seite, statt nur für ein einzelnes Bild erzeugen, aber wirklich Traffic gibt das wohl nicht.

... zumal nur die URL des src Attributs weitergeleitet wird. Die Browser werden versuchen, die Zielseite als Bild darzustellen, was nicht funktioniert.

15.11.2019 22:10

1 Forenmitglied fand diesen Beitrag gut

... 1 Jahr und 9 Monate später ...

7 WhiteWay

Hallo Jörg!

Ich versuche auch gerade Hotlinking auszuschließen mit diesem Beispielcode:
AddDefaultCharset utf-8
Header always unset "X-Powered-By"

RewriteEngine On 
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourwebsite.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?facebook.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?twitter.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?other-websites-go-here.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

Wobei ich yourwebsite.com mit meiner Seiten-URL ersetzt habe. Resultat ist aber, daß auch auf meiner Seite keine Images mehr angezeigt werden.

In der .htaccess habe ich anfangs einige deny from und danach kommt dann gleich obiger Code.

Was habe ich da falsch verstanden?

01.09.2021 15:22

8 Jörg Kruse

Wobei ich yourwebsite.com mit meiner Seiten-URL ersetzt habe.

also beispielsweise "example.com"? eine Seiten-URL würde noch mehr beinhalten

Resultat ist aber, daß auch auf meiner Seite keine Images mehr angezeigt werden.

Dein Browser übermittelt den Referrer ordungsgemäß? es gibt ja z.B. Addons, die den Referrer verändern.

Beim Testen einer .htaccess Datei würde ich zwischendurch auch immer den Browser-Cache leeren.

01.09.2021 16:09 | geändert: 01.09.2021 16:11

9 WhiteWay

also beispielsweise "example.com"? eine Seiten-URL würde noch mehr beinhalten

Ja

Dein Browser übermittelt den Referrer ordungsgemäß? es gibt ja z.B. Addons, die den Referrer verändern.

Beim Testen einer .htaccess Datei würde ich zwischendurch auch immer den Browser-Cache leeren.

Ich habe bislang mit Firefox und Chrome getestet und keine Addons installiert.

01.09.2021 16:56

10 Jörg Kruse

... und den Browser-Cache komplett geleert? voreingestellt beim Löschen ist oft nur ein bestimmter Zeitraum.

Wenn der Referrer nicht verändert wird, auch nicht durch einen Proxy o.ä., bleibt eigentlich nur eine fehlerhafte Umsetzung des Codes.

Für dieses Forum müsste die Code-Zeile z.B. so aussehen:

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?joergs-forum.de [NC]

Falls es um eine Umlaut-Domain o.ä. geht: in dem Fall muss der Puny-Code der Domain verwendet werden.

02.09.2021 11:05

1 Forenmitglied fand diesen Beitrag gut