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