Nginx: Hotlink-beskyttelse med rewrite

Nesten alle som driver et nettsted med redaksjonelt innhold på internett, kjenner til dette: bildetyveri via hotlinking. Og helst sammen med komplett kopiert tekst som man har brukt mye tid på å researche, skrive og korrekturlese i timevis.

Nginx: Veiledning – Konfigurer hotlink-beskyttelse

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:

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!

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 …

Platzhalterbild bei Bilderdiebstahl

$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.

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.

Test bilde-URL

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.

Om forfatteren

Saskia Teichmann rådgir om KI, e-handel og digitale plattformer og verifiserer selv tekniske antakelser i arkitektur og kode.

Mer om arbeidet mitt

Diskusjon om innlegget

9 kommentarer

Spørsmål, tillegg og erfaringer fra praksis – historisk vokst og her bevart i sin helhet.

  1. Kuwe

    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* 🙂

    Svar
    1. Saskia Lund

      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!

      Svar
  2. Frank

    Supert innlegg! Hvor nøyaktig skal koden plasseres? I .htaccess i roten av nettstedet? Eller i en egen .htaccess i bildemappen? Tusen takk!

    Svar
    1. Saskia Lund

      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 -t kort dobbeltsjekke. Når nginx i terminalen melder tilbake at alt er tutti, kan du per service nginx restart starte webserveren på nytt og dermed laste inn den nye konfigurasjonen.

      Lykke til!

      Svar
  3. Frank

    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.

    Svar
    1. Saskia Lund

      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

      Svar
  4. Müller

    Hvem kjenner til en hotlink-beskyttelse for bmbfotos.com?
    for denne siden fungerer ingenting

    Svar
    1. Saskia Lund

      Hallo „Müller“!
      Hvilke bilder på det nevnte nettstedet er for eksempel hotlinket?
      Kanskje noen kan hjelpe dem videre.

      Vennlig hilsen
      Saskia Lund

      Svar

Bli med i diskusjonen

E-postadressen din blir ikke publisert. Obligatoriske felt er markert.

Innlegg fra studioet

Nye innlegg på e-post.

Når en ny verkstedrapport eller veiledning publiseres, mottar du en kort e-post med lenken. Ingen fast takt, ingen reklamestrekning.

Les heller via RSS

Registreringen aktiveres først når du klikker på bekreftelseslenken. Du kan når som helst avslutte abonnementet via lenken i hver e-post.