Выключить Hotlinking для картинок в Nginx/Apache

Выключить Hotlinking для картинок в Nginx/Apache

Что такое image hotlinking?

Image Hotlinking  — очень плохая идея, т.к  это будет нагружать сервер ( забивать полосу пропускания сервера). Что это означает? Это означает что если кто-то создает ссылку на изображение, то картинка отображается на их веб-сайтах и в результате чего, вы будете платить больше полосы пропускания из-за этого.

Итак,  в своей теме «Выключить Hotlinking для картинок в Nginx/Apache» я обеспечю серверу на Nginx блокировку любых попыток хотлинкинга.

Конфигурации Анти-хотлинкинга  на Nginx.

Используйте директиву location внутри файла конфигурации Nginx:

sh
6 lines
location ~ .(gif|png|jpe?g)$ {
valid_referers none blocked linux-notes.org *.linux-notes.org;
if ($invalid_referer) {
return 403;
}
}

Первая строка показывает перечисление файлов с картинками, если у вас есть другие расширения, то добавьте чтобы защитить себя от хотлинкинга.

valid_referers — эта строка содержит список сайтов, разрешенных для hotlink изображений, ваш должен быть указан там, но если у вас есть другие сайты, то вы можете добавить их.

Вы также можете защитить файлы от определенного каталога. Например:

sh
6 lines
location /pictures/ {
valid_referers none blocked linux-notes.org *.linux-notes.org;
if ($invalid_referer) {
return 403;
}
}

Кроме того, вместо отправки 403, вы можете заменить реальное изображение с пользовательской картинки на лету, используя этот код:

sh
11 lines
#Prevent hotlinking
location ~ .(gif|png|jpe?g)$ {
expires 7d;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
valid_referers none blocked .linux-notes.org;
if ($invalid_referer) {
rewrite (.*).(jpg|jpeg|png|gif)$ http://www.linux-notes.org/images/hotlink_block.jpg;
#rewrite (.*) /static/images/hotlink_block.jpg redirect;
}
}

Использование кода что выше в файле конфигурации виртуального хоста вашего сайта будет заменять hotlinked изображение с вашего пользовательского изображения.

Но можно не ставить данные заглушки, т.к они могут создать нагрузку на сервере и можно обойтись кодом ошибки 403. лучше всего добавить доверенные сайты ( сайты которые попадают в «белый список hotlink»), я добавил это следующим образом:

sh
13 lines
location ~* ^.+.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
root $root_path;
valid_referers none blocked server_names ~(vash-site|yandex|google|yahoo|bing|facebook|subscribe|feedburner|mail|rambler|nigma|ask|qip|bing);
if ($invalid_referer) {
return 403;
}
error_page 404 /40x.html;
location = /40x.html {
root /usr/share/nginx/html/;
}
}

Конфигурации Анти-хотлинкинга  на Apache.

Для веб сервера apache, все запрещения осуществляются через файл .htaccess. :

sh
4 lines
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?linux-notes.org [NC]
RewriteRule .(jpg|jpeg|png|gif)$ - [NC,F,L]

ВНИМАНИЕ! Сделайте изменения и пропишите ваш сайт.

Для вашего сайта будет разрешено использование Hotlink, а для все остальных будет запрещаться данными правилами.

Рассмотрим другой пример, например, вы захотели отдавать с вашего сервера определенные картинки( для примера — баннер) и разрешить вставлять их на других доменах. Так же, для всех остальных ( для тех кто хотит использовать ваши файлы с картинками), я поставлю заглушку Hotlink_ban.gif:

sh
4 lines
RewriteCond %{HTTP_REFERER} !^http://www.linux-notes.org/ [NC]
RewriteCond %{REQUEST_URI} !banner.gif$ [NC]
RewriteCond %{REQUEST_URI} !Hotlink_ban.gif$ [NC]
RewriteRule .(jpe?g|gif|bmp|png)$ http://www.linux-notes.org/images/Hotlink_ban.gif [L]

Однако,  в таком подходе имеется небольшой минус — картинки могут давать нагрузку. По этому,  внесем некоторые изменения в файл ( правила):

sh
12 lines
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?linux-notes.org [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?google.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yandex.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?rambler.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?nigma.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?bing.com[NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yahoo.com[NC]
RewriteRule .(jpg|jpeg|png|gif|mp.3)$ — [NC,F,L]

Прописываем все разрешенные домены для которых не действуют правила и на них можно будет увидеть ваши картинки подгруженную по хотлинку.

Тестирование Hotlinking  в Nginx/Apache

Используйте команду чтобы перезапустить nginx:

sh
1 lines
# nginx·-s·reload

Я использовал этот инструмент для проверки хотлинков:

http://www.htaccesstools.com/test-hotlink-protection/

Замечание! Всегда используйте окно в режиме инкогнито для этого теста, т.к ваши изображение могут быть уже в кэше.

Другой способ тестирования с помощью команды curl:

sh
1 lines
#·curl --referer http://www.some_domain <IMAGE_URL>

Должен показать либо перенаправление на 302 или вернуть анти-хотлинк изображение. но следующий тест, должен вернуть картинку, т.к есть для него правило ( если прописали их).

sh
1 lines
#·curl --referer http://www.google.com <IMAGE_URL>

Все сделано, теперь вы знаете, как защитить ваш сайт и каталог с изображениями от хотлинкинга. А на этом все, тема «Выключить Hotlinking для картинок в Nginx/Apache» завершена.

Was this helpful?

0 / 0