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

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

Что такое image hotlinking?

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

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

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

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

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

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

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

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

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

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

#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»), я добавил это следующим образом:

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

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:

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]

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

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:

# nginx -s reload

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

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

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

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

# curl --referer http://www.some_domain <IMAGE_URL>

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

# curl --referer http://www.google.com <IMAGE_URL>

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.