защита от hotlink c nginx ( Debian , CentOS )

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

location ~ \.(jpg|png|gif)$ {
valid_referers server_names blocked none frienddomain.com *.frienddomain.com ;
if ($invalid_referer) {
return 403;
}
}

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

с локейшеном — location ~ \.(jpg|png|gif)$ в еррор логе nginx идет вот такая запись :

2010/12/13 12:11:58 [error] 16362#0: *110 open() «/usr/local/nginx/html/comedy/009.jpg» failed (2: No such file or directory),
2010/12/13 12:11:59 [error] 16362#0: *110 open() «/usr/local/nginx/html/comedy/009.jpg» failed (2: No such file or directory),

что свидетельствует нам о некорректности пути. Подправив локейшен был приятно удивлен работоспособностью правила =) . Корректное правило :

location ~* ^.+\.(svg|mp3|ogg|mpe?g|zip|gz|bz2?|rar|jpg|png|gif|jpeg|flv)$ {
root /path/to/site/;
valid_referers none blocked server_names ;
if ($invalid_referer) {
return 403;
}
}

PS для работы должен быть включен в состав nginx модуль — ngx_http_referer_module , который по-умолчанию включен. при конфигурации отсутствие —without-http_referer_module говорит нам, что этот модуль есть.

Приятных блокировок ! =)

Tags: , , ,

14 комментариев to “защита от hotlink c nginx ( Debian , CentOS )”

  1. Илья Says:

    может так лучше

    server {

    location ~ \.(jpg|gif|png)$ {
    valid_referers none blocked server_names ~\.google\. images.yandex.ru;
    if ($invalid_referer) {
    return 403;
    }
    }
    }

  2. Илья Says:

    или в принципе можно сервер найм пустым оставить? я вот думаю а надо ли чтобы гугл и яндекс картинки парсили

  3. admin Says:

    Вообще иногда и за счет картинок увеличивается посещаемость ( если они уникальны ), но пока на каких серверах не ставил защиту, хуже не было.

  4. Илья Says:

    а вопросики так и должно быть?

  5. Илья Says:

    mpe?g

  6. Claus Says:

    Ребят как узнать работает nginx в связке с апачем у меня на сервере или нет? Просто не совсем разбираюсь в этом вопросе. А недавно переехал на VPS/ И встал вопрос о хотлинке. Но обычное редактирование файла htaccess не помогает. Судя по phpinfo() у меня Apache Version: Apache/2.2.9 (Debian) если через консоль поглядеть top то там присутствует процесс nginx.

  7. admin Says:

    проще всего через ssh :

    netstat -plnt

    будет видно.

  8. Claus Says:

    Николай, ввел netstat -plnt, в результатах нашел такую строчку:

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 501/nginx

    Это оно? Если оно, тогда подскажите пожалуйста, где именно прописывать, то что вы описали в заметке?

  9. admin Says:

    Да, nginx у Вас висит на 80 порту, а апач стоит бекендом скорее всего на 8080. Крайне советую Вам нанять администратора, хотя бы на час, так как отсутствие понимания в данном вопросе может привести к неправильной конфигурации nginx и неработоспособности всех сайтов. Говорю это не в силу того, что сам администрирую сервера, а в силу того, что видел очень много раз, как клиенты нападали с проблемами с подобным конфигом. Еще проще — попросите вашего хостера сделать подобное, тут работы максимум минут на 5.

    В принципе основной конфиг nginx — /etc/nginx/nginx.conf ( это при конфигурировании панелью ISPmanager )

  10. Claus Says:

    Николай, спасибо за помощь! Все заработало — вставил в конфиг :
    location ~* ^.+\.(svg|mp3|ogg|mpe?g|zip|gz|bz2?|rar|jpg|png|gif|jpeg|flv)$ {
    root /var/data/www/fishing.lugansk.ua/;
    valid_referers none blocked server_names ;
    if ($invalid_referer) {
    rewrite ^(.*)$ /images/antilich.jpg redirect;
    }
    }

    только почему то картинка images/antilich.jpg не подменяется. И еще вопрос а как к примеру быть с поисковиками данный код позволяет индексировать картинки?

  11. admin Says:

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

  12. Саша Says:

    Искала правильное решение и — нашла только в вашем блоге. Спасибо большое!

  13. admin Says:

    Хорошо, когда информация приносит пользу =)

  14. Kilas Says:

    У меня вот аткая конструкция работает, но есть вопрос, у меня сайт https и хотлинки которые идут по такой ссылке http://cайт.ru/картинка.png блокируются, но хотлинки https://сайт.ru/картинка.png не блокируются =(

    location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|htm|html|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|zip|tar|tgz|gz|rar|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mpeg|mpg|wmv|exe|iso|dmg|swf)$ {
    root /путь до/сайта;
    valid_referers none blocked server_names ~(yandex|google|yahoo|bing|facebook|fbcdn);
    if ($invalid_referer) {
    rewrite (.*)\.(jpg|jpeg|png|gif)$ https://положил картинку на стронний сервис которая будет отображаться как запрет хотлинка;
    }

Leave a Reply