Ikke engang en lenke tilbake til ditt eget nettsted følger med, med mindre innholdstyven har kopiert hele innholdet rett fra kildekoden og limt det inn på sin egen nettside. Da kan det hende du et sted har lenket til et annet av dine egne innlegg med full URL, og at den lenken fortsatt ligger i teksten. Men pust ut først, så tar vi én ting om gangen:
Hva er egentlig en hotlink?
En hotlink er for eksempel et bilde som bygges inn ved å lenke direkte til den eksisterende nettadressen. Altså uten å laste ned bildet først, laste det opp på egen webplass eller server og deretter lenke til det derfra.
Hotlinking er ikke alltid et problem. I hvert fall ikke når partene har avtalt det, eller når man driver en tjeneste for bildeopplasting.
Men de fleste av oss driver ingen slik tjeneste. Vi betaler bare pliktoppfyllende for webhotellet hver måned og har en bestemt trafikkgrense. Og her kommer vi til kjernen i problemet.
Hvis noen andre viser mediefiler fra webserveren din på sitt nettsted, svarer serveren din på hver av disse forespørslene. Det er jo det servere gjør: De betjener forespørsler og leverer innhold.
Nå har innholdstyven et gratis bilde på nettstedet sitt, uten at trafikken belastes deres egen server. Trafikken og serverbelastningen faller fortsatt på den som er frastjålet bildet, altså deg, og bruker serverressurser hver gang noen besøker innholdstyvens nettside og får bildet vist i nettleseren.
Det kan i enkelte tilfeller gi enorme mengder trafikk fra andre nettsteder, avhengig av hvor mange besøkende innholdstyvens nettsted har.
Det er virkelig ikke morsomt.
I dag vil jeg vise deg hvordan du kan sette opp din egen NGINX-webserver slik at den ikke svarer på disse forespørslene som forventet, men i stedet viser et annet bilde til dem som besøker innholdstyvens nettsted.
Slik kan du snu den tilsynelatende skaden til din egen fordel og, hvis du er skikkelig sint, gi tyven en lærepenge: få de besøkende over til ditt eget nettsted!
Slik gjør du NGINX til en uslåelig sluttboss mot hotlinking!
Dette er planen:
- Vi vil ha en felles løsning som fungerer for alle domener, slik at vi slipper å tilpasse hver enkelt vHost-konfigurasjon i sites-available.
- Nettadressen i forespørselen skal skrives om (rewrite), slik at et bestemt annet bilde leveres til tyvens nettside i stedet.
- Løsningen må fungere med Google Bildesøk og andre søkemotorer som har bildesøk, i stedet for å forby all hotlinking. Ellers viser Google Bildesøk bare erstatningsbildet, og ikke de egentlige bildene dine.
Løsningen på bildetyveriet
Disse få kodelinjene er løsningen på problemet med bildetyveri. I neste avsnitt ser du hvor og hvordan koden skal legges inn.
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf)$ { add_header "Access-Control-Allow-Origin" "*"; access_log off; log_not_found off; expires max; valid_referers none blocked ~.google. ~.bing. ~.yahoo. ~.yandex. server_names ~($host); if ($invalid_referer) { rewrite (.*) /hotlink/achtung-inhalts-und-bilderklau.png redirect; } } #avslutt hotlink-viderekoblingssløyfe location = /hotlink/achtung-inhalts-und-bilderklau.png { }
Hva gjør koden?
~ brukes når det skal skilles mellom store og små bokstaver, mens ~* ikke skiller mellom dem.
NGINX kontrollerer location-reglene i den rekkefølgen de regulære uttrykkene står. Det betyr at instruksjonene for hurtigbufferhoder for mediefiler og instruksjonene for hotlink-beskyttelsen må ligge i samme blokk!
location = /hotlink/achtung-inhalts-und-bilderklau.png { } trengs for å unngå en endeløs omdirigeringssløyfe når det kommer en ny forespørsel om erstatningsbildet:
Bildetyvsiden sender forespørsel om bilde A → vår NGINX omdirigerer forespørselen til erstatningsbildet → bildetyvsiden sender forespørsel om erstatningsbildet → vår NGINX omdirigerer forespørselen til erstatningsbildet, men leverer det ikke → og slik fortsetter det …

$host er en variabel som gjør denne regelen brukbar globalt, under alle vHost-domener på webserveren. Følgende URL blir gyldig for hvert domene: http://$host/hotlink/achtung-inhalts-und-bilderklau.png
Du trenger bare å opprette mappen /hotlink under hvert domene og legge en bildefil med navnet achtung-inhalts-und-bilderklau.png i denne mappen. Du kan gi filen og mappen andre navn hvis du vil. Husk bare å tilpasse koden tilsvarende.
Slik legger du inn location-regelen
Slik går du frem for å utstyre NGINX-webserveren din med denne spesielle hotlink-beskyttelsen mot bildetyveri.
Total Time: 30 minutes
Forberedelser: Lag og last opp erstatningsbildet
Lag først bildet som de besøkende på tyvens nettsted skal få se, og last det opp i ønsket mappe på webserveren din. Noter nettadressen til bildet.
Tilpass location-konfigurasjonen på NGINX-webserveren
Gå til mappen /etc/nginx/common/ på serveren. Finn location-konfigurasjonen som er inkludert i serverblokken til vHost-en din, og som inneholder regler for location-uttrykket i koden ovenfor. Som regel finnes det allerede en regelblokk for denne location-regelen. Hvis ikke, legger du inn koden ovenfor som en ny regelblokk i riktig fil.
Hvis blokken allerede finnes, legger du bare inn reglene ovenfor, uten den ytre location-blokken.
Lagre NGINX-konfigurasjonen og last den inn på nytt
Lagre deretter konfigurasjonsfilen med den utvidede location-blokken på serveren, og test den nye konfigurasjonen i SSH-terminalen med nginx -t.
Hvis testen går gjennom uten merknader, starter du NGINX på nytt med kommandoen service nginx restart.
Test hotlink-beskyttelsen din!
Jeg har skrevet et verktøy du kan bruke til å teste oppsettet for hotlink-beskyttelse. Legg inn den direkte nettadressen til et bilde på NGINX-serveren din i feltet. I visningsfeltet nedenfor skal erstatningsbildet helst dukke opp. Hvis bildet fra nettadressen du skrev inn, vises i stedet, må du kontrollere hotlink-beskyttelsen en gang til.
Hvis du vil teste samme bilde-URL flere ganger etter hverandre, må du tømme nettleserens hurtigbuffer etter hver test og laste denne siden på nytt.
Har du flere spørsmål? Bruk gjerne kommentarfeltet under innlegget!
Del gjerne artikkelen på Facebook-siden din, via Twitter, Google+ eller en annen sosial plattform du velger. Delingsknappene finner du lenger ned. Det er raskt og enkelt å dele, og det ville glede meg veldig.




Super genialt innlegg! Ideen er virkelig enkel 🙂 synes jeg er super. Så langt har jeg dessverre aldri tenkt på det, fordi noe slikt aldri har vært et problem for meg (kan ha noe med innholdet å gjøre ;)).
Jeg er også veldig overrasket over å lese noe om Nginx-konfigurasjon på en frontend-/designside. WordPress er jo heller tilpasset Apache, selv om enkelte utvidelser nå også støtter Nginx mer og genererer konfigurasjoner for det i stedet for bare å opprette en Apache-htaccess 😉
Forresten, designene dine synes jeg også er kjempebra! *Tommel opp for begge* 🙂
Tusen takk for denne flotte tilbakemeldingen!
Jeg mener nginx er den «bedre» og raskere webserveren i samspill med WordPress, for å være ærlig. Bare googl litt om temaet. 🙂
Til frontend-kommentaren:
Jeg er riktignok frontend-utvikler, men siden jeg har spesialisert meg på WordPress, er det etter mitt syn ingen vei utenom PHP, og på sikt heller ikke utenom serverrelaterte spørsmål.
Tusen takk igjen!
Supert innlegg! Hvor nøyaktig skal koden plasseres? I .htaccess i roten av nettstedet? Eller i en egen .htaccess i bildemappen? Tusen takk!
Hallo Frank!
Hvis du bruker en nginx-webserver, blir ikke .htaccess tatt hensyn til; en nginx-webserver kan med andre ord ikke bruke .htaccess-filer til noe.
.htaccess-filer brukes sammen med Apache-webservere.
Koden nevnt ovenfor brukes på en nginx-webserver i serverkatalogen /etc/nginx/common/ vanligvis i filen locations.conf globalt.
Det er viktig å se nøye på din egen serverkonfigurasjon i locations.conf. Hvis det allerede finnes en locations-regel for den ovennevnte locationen, må du tilpasse den med koden ovenfor; ellers, som nevnt, bare lim den inn, lagre, og deretter laste den nye nginx-konfigurasjonen via terminalkommandoen
nginx -tkort dobbeltsjekke. Når nginx i terminalen melder tilbake at alt er tutti, kan du perservice nginx restartstarte webserveren på nytt og dermed laste inn den nye konfigurasjonen.Lykke til!
Takk, og beklager … Nginx i overskriften hadde jeg oversett. Jeg leter etter en fungerende hotlink-beskyttelse for Magento-butikken min på en Apache-server, helst uten straff fra Google.
Hallo Frank!
For et Apache-motstykke kan du prøve å sette inn følgende i .htaccess-filen i rotkatalogen på nettstedet ditt:
1. Variante (hvis du generelt vil forby hotlinking av bildefiler, men tillate hotlinking for bestemte domener (f.eks. google.*, bing.*, yahoo.*, yandex.*, duckduckgo.*, etc.):
<IfModule mod_rewrite.c> RewriteEngine on # Fjern den følgende linjen hvis du også vil blokkere tomme referer-URL-er: RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?deinedomain.de [NC] RewriteRule \.(jpe?g|png|gif|bmp)$ - [NC,F,L] # Hvis du nå vil vise et erstatningsbilde i stedet for det faktisk hotlinkedede bildet, erstatter du regelen ovenfor slik: # RewriteRule \.(jpe?g|png|gif|bmp) http://deinedomain.de/blocked.png [R,L] # Tillat hotlinking fra følgende nettsteder (domener) RewriteCond %{HTTP_REFERER} !^https?://(www\.)?google\.com/.*$ [NC] </ifModule>2. Hvis du bare vil blokkere hotlinking for bestemte referrers (skurkedomener):
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?schlingel1\.com [NC,OR] RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?schlingel2\.com [NC,OR] RewriteRule \.(jpe?g|png|gif|bmp)$ - [NC,F,L] # Hvis du nå vil vise et erstatningsbilde i stedet for det faktisk hotlinkedede bildet, erstatter du regelen ovenfor slik: # RewriteRule \.(jpe?g|png|gif|bmp) http://deinedomain.de/blocked.png [R,L] </ifModule>Jeg håper dette hjelper deg videre
Vennlig hilsen
Saskia
Hvem kjenner til en hotlink-beskyttelse for bmbfotos.com?
for denne siden fungerer ingenting
Hallo „Müller“!
Hvilke bilder på det nevnte nettstedet er for eksempel hotlinket?
Kanskje noen kan hjelpe dem videre.
Vennlig hilsen
Saskia Lund
Kan man også bare blokkere ett domene? Med rewrite?