Выключить 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» завершена.