Задать вопрос
alexjet73
@alexjet73

Как правильно использовать valid_referers в Nginx?

Решил попробовать сделать защиту от хотлинка. Сразу же вышло решение:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    				valid_referers none blocked my.domain.ru www.my.domain.ru;
				    if ($invalid_referer) {
				        return   403;
				    }
                expires max;
                log_not_found off;
    }

Однако после nginx -s reload ничего не изменилось. Пробовал вставить изображение в codepen и jsfiddle - всё работает и не блокируется.
Решил проверить работу раздела вообще и поменять домен на левый, все перечисленные файлы сразу же ушли в 403, т.е. если меняешь домен все хорошо. Однако ставишь если свой, то вставляя картинку в jsfiddle и codepen все норм.

Посмотрел потом доки NGINX написано $invalid_referer Пустая строка, если значение поля “Referer” заголовка запроса считается правильным, иначе “1”.
Попробовал поменять на if ($invalid_referer = "1") {, тоже результата нет.

Поясните, пожалуйста, как это вообще работает?
  • Вопрос задан
  • 1808 просмотров
Подписаться 1 Простой 7 комментариев
Решения вопроса 1
alexjet73
@alexjet73 Автор вопроса
Нашел решение, на одном сайте в комментах. И оно сработало для меня.
Убрать none в строке valid_referers none blocked my.domain.ru www.my.domain.ru;

Буду благодарен, если кто подскажет причину почему с none не работало. Ведь в доках NGINX пишется пример именно с none (как параметр отсутствия Referer)?!
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bahinnn
Вебмастер, электрощик
напишу для тех у кого такие же проблемы, как у топикстартера

valid_referers none blocked server_names ~(\.yandex\.|\.google\.);
if ($invalid_referer) {
rewrite (.*)\.(jpg|jpeg|png|gif)$ [ссылка куда редиректить];
или
return 403; //блокируем 
}


если нужно заблокировать доступ к url на вашем сайте, всем кроме нужных referer:
location ~ "[ссылка на вашем сайте]" {
try_files $uri $uri/ /index.php?$args;
valid_referers none blocked server_names ~(\.yandex\.|\.google\.);
if ($invalid_referer) { return 403;  }
}


пояснение:
server_names - это ваш домен, не нужно вписывать что-то типа my.domain.com
если убрать [none blocked] эти = ~(\.yandex\.|\.google\.) блокнуться (у автора топика нет внешних источников, поэтому [none blocked] мешало)

добавлять нужно в location соблюдая последовательность — вставите не в тот location, работать не будет!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы