Ochrona przed hotlinkingiem w NGINX bez blokowania Grafiki Google

W tym artykule
- Czym jest hotlinking obrazków i jak NGINX go wykrywa?
- Jak działa valid_referers w NGINX
- Bezpieczna konfiguracja ochrony przed hotlinkingiem krok po kroku
- Dlaczego puste nagłówki Referer muszą być dozwolone
- Jak utrzymać obrazki w Grafice Google
- Sprawdzanie logów po włączeniu ochrony przed hotlinkingiem
- Jak ochrona przed hotlinkingiem współgra z cache i limitami dla botów
- FAQ
Ochrona przed hotlinkingiem w NGINX przepuszcza żądania obrazków tylko wtedy, gdy nagłówek Referer jest pusty, wskazuje na Twoje własne domeny albo pochodzi z wyszukiwarki. Wszystko inne dyrektywa valid_referers odrzuca. Po co to? Żeby inne strony nie osadzały Twoich plików i nie kazały Twojemu serwerowi płacić za ich dostarczanie (mówi się na to kradzież transferu obrazków). Prawdziwym zagrożeniem nie są jednak złodzieje. Jest nim zbyt surowa reguła, bo po cichu może ona sprawić, że Twoje zdjęcia znikną z Grafiki Google. Wszystko, co opisuję poniżej, działa na Twoim własnym serwerze źródłowym NGINX.
Czym jest hotlinking obrazków i jak NGINX go wykrywa?
Ktoś wstawia adres Twojego obrazka do własnego znacznika <img>. Od tej chwili to Twój serwer dostarcza plik jego odwiedzającym. To właśnie hotlinking. Gdy przeglądarka ładuje taką stronę, zwykle wysyła nagłówek Referer z adresem strony, która osadza obrazek, a NGINX może porównać go z listą dozwolonych adresów. Ten nagłówek to jednak tylko wskazówka. Nic więcej. Przeglądarki i proxy mogą go pominąć albo wyciąć, więc nigdy nie jest prawdziwym uwierzytelnieniem. Zyskujesz koniec przypadkowego osadzania na innych stronach. A ktoś, kto celowo chce zdobyć Twoje pliki? Nadal je zdobędzie.
Jak działa valid_referers w NGINX
Dyrektywa valid_referers ustawia zmienną $invalid_referer. Potem blok if zwraca 403 (albo obrazek zastępczy) dla każdego żądania, które nie pasuje. Przykład z dokumentacji modułu referer w NGINX mieści wszystkie typy parametrów w jednej linii:
valid_referers none blocked server_names *.example.com example.* www.example.org/galleries/ ~.google.;- none obejmuje żądania w ogóle bez nagłówka Referer.
- blocked obejmuje nagłówki, które istnieją, ale zostały opróżnione przez proxy albo firewall.
- server_names obejmuje to, co masz w dyrektywie
server_name. Wpisz tam wersję z www i bez www, a także każdą subdomenę albo hosta CDN, który serwuje Twoje strony. - Symbole wieloznaczne, takie jak
*.example.com, i wyrażenia regularne zaczynające się od~obsługują szersze wzorce, w tym domeny wyszukiwarek.
Bezpieczna konfiguracja ochrony przed hotlinkingiem krok po kroku
Bezpieczna oznacza tu trzy rzeczy: sprawdzasz tylko pliki graficzne, przepuszczasz puste i zaufane nagłówki Referer, a wszystkim pozostałym zwracasz zwykłe 403. Kroki:
- Utwórz blok location, który pasuje tylko do rozszerzeń obrazków.
- Dodaj
valid_referers none blocked server_names, a potem swoje domeny i~.google.. - Dodaj
if ($invalid_referer) { return 403; }. - Uruchom
nginx -t, a potem przeładuj NGINX. - Przetestuj curlem, wysyłając różne nagłówki Referer.
location ~* .(jpg|jpeg|png|gif|webp|avif|svg)$ {
valid_referers none blocked server_names
example.com www.example.com
~.google.;
if ($invalid_referer) {
return 403;
}
}Twoje strony HTML nie są objęte tą regułą, bo dotyczy ona tylko plików graficznych. Czy zamiast 403 podstawić złośliwą grafikę z napisem „kradziony obrazek”? Nie polecam. Zwykłe 403 łatwiej utrzymać i nikogo nie wprowadza w błąd co do tego, czym naprawdę jest plik. Potem przetestuj cztery przypadki: brak nagłówka Referer, własną domenę, domenę Google i obcą domenę. Na przykład curl -I -e https://other-site.test/ https://example.com/photo.jpg powinno zwrócić 403, a to samo żądanie bez -e powinno dać 200.
Dlaczego puste nagłówki Referer muszą być dozwolone
Jeśli zablokujesz żądania bez nagłówka Referer, odetniesz prawdziwych użytkowników i crawlery. Dlatego none i blocked nie są opcjonalne. Kto nie wysyła nagłówka Referer? Ludzie wpisujący adres ręcznie, osoby z restrykcyjnymi ustawieniami prywatności, zakładki, czytniki kanałów, crawlery. Do tego Googlebot-Image pobiera pliki bez strony odsyłającej, więc reguła bez none całkowicie go blokuje. Najczęstsze błędy:
- pominięcie
nonealboblocked, - zapomnienie o wersji domeny z www,
- sprawdzanie całej witryny zamiast samego bloku location dla obrazków,
- wyrażenie regularne dla Google tak wąskie, że nie łapie domen krajowych.
Jak utrzymać obrazki w Grafice Google
Google musi móc pobrać dokładnie ten plik, który widzi użytkownik. Dlatego żadnego specjalnego wyjątku dla Googlebot-Image i żadnej innej odpowiedzi. Serwowanie crawlerom czegoś innego niż ludziom to po prostu cloaking. Twoja reguła powinna traktować każdego klienta tak samo i różnić się tylko nagłówkiem Referer. Zgodnie z wytycznymi Google dotyczącymi SEO obrazów Google znajduje obrazki w standardowym atrybucie <img src>, akceptuje mapy witryny dla obrazów, obsługuje formaty takie jak WebP, SVG i AVIF i nie indeksuje obrazków tła z CSS. Chcesz ograniczyć wyświetlanie plików w pełnym rozmiarze? Oficjalna droga to rezygnacja z linkowania bezpośredniego w Grafice Google, a Google zapewnia, że nie traktuje tego jako cloakingu obrazów.
Sprawdzanie logów po włączeniu ochrony przed hotlinkingiem
Reguła wdrożona. Teraz przejrzyj w logach dostępu żądania obrazków, które dostały 403, i upewnij się, że żadne nie przyszło z Twojej strony ani od Google. Filtruj po statusie, $http_referer, user agencie i ścieżce obrazka. Pierwszy raz przekopujesz się przez te dane? Nasz poradnik o tym, jak czytać żądania obrazków w logach dostępu, omawia poszczególne pola. Jeśli obrazki zaczną znikać z Grafiki Google, usuń na jakiś czas wyrażenie regularne i blok if, a potem porównaj logi sprzed i po zmianie, żeby zobaczyć, który Referer został odrzucony.
Jak ochrona przed hotlinkingiem współgra z cache i limitami dla botów
Sprawdzanie nagłówka Referer działa niezależnie od cache i ograniczania liczby żądań. Jednak kolejność reguł w konfiguracji decyduje o tym, co faktycznie dostaje crawler. Jeśli przed serwerem źródłowym stoi cache, odpowiedź 403 wywołana obcym nagłówkiem Referer nigdy nie może zostać zapisana i potem serwowana wszystkim (to naprawdę boli). Przejrzyj swoje reguły cache dla crawlerów, żeby takie odpowiedzi były trzymane osobno. A na agresywne scrapery limity żądań zawsze działają lepiej niż ostrzejsze reguły dla nagłówka Referer. Są sposoby ograniczania botów bez szkody dla Googlebota.
Oprzyj ochronę przed hotlinkingiem na none, blocked, server_names i domenach Google, a zablokujesz osadzanie Twoich obrazków na innych stronach, zachowując ich widoczność w wynikach wyszukiwania.
FAQ
Czy ochrona przed hotlinkingiem usunie moje obrazki z Grafiki Google?
Nie, o ile dopuszczasz żądania bez nagłówka Referer i domeny Google. Stosuj tę samą regułę do każdego odwiedzającego i crawlera, a Googlebot-Image będzie pobierał Twoje pliki tak jak wcześniej.
Czy dopisać Googlebot-Image do białej listy po user agencie?
Nie. Reguła dla nagłówka Referer wystarczy, bo crawler nie wysyła strony odsyłającej, a none już go przepuszcza. Osobne traktowanie crawlerów to proszenie się o kłopoty z cloakingiem.
Czy ochrona przed hotlinkingiem powstrzyma kogoś przed pobraniem moich obrazków?
Nie. Blokuje tylko osadzanie na innych stronach. Każdy może podrobić albo pominąć nagłówek Referer, więc bezpośrednie pobranie nadal działa.
Daj każdej stronie własne IP.
Pierwszą domenę dodasz w kilka minut.


