#nginx #request #http-referer
#nginx #запрос #http-refererer
Вопрос:
Как мне узнать, когда переменная nginx $ http_referer не установлена или пуста?
Я получаю некоторые запросы, у которых нет http-ссылки. В журналах nginx $ http_referer отображается следующим образом: «-«. Что я пытаюсь сделать, так это «вернуть 403;», если $ http_referer не установлен или не пуст, как в этом случае.
Спасибо!
Комментарии:
1. Я пытался использовать регулярные выражения, но, похоже, не работает — или отклоняет все с 403. Я искал метод, который сообщал бы мне, установлена ли переменная nginx или нет …. но я его пока не нашел.
2. Что, если мой браузер настроен на то, чтобы никогда не отправлять заголовки referer для любого сайта?
3. Хм … что мне действительно нужно, так это запретить каждый доступ к ресурсам запросов, которые являются простыми получениями, например, и у них нет «кого-либо», отправляющего их … например, http_referer …
Ответ №1:
http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers
valid_referers server_names ~.;
if ($invalid_referer) {
return 403;
}
Комментарии:
1. Спасибо.. но я получил сообщение об ошибке: ‘[emerg]: в директиве «valid_referers» указаны ссылки «none» или «blocked» без какого-либо действительного ссылки’
2. Исправленная версия @Clawsy блокирует каждый запрос с пустым референтом. Любой непустой реферер считается правильным.
3.
server_names ~.
работает в отличие отvalid_referers none;
, который выдает ошибку, о которой упоминает @Clawsy. Рабочая методика @Tim устанавливает список допустимыхserver_names
значений в соответствии с любым сервером, задавая для него значение регулярного выражения с использованием~
и любого символа с использованием.
. Смотрите также: nginx.org/en/docs/http/ngx_http_referer_module.html
Ответ №2:
Как насчет этого?
if ($http_referer ~ /^$/) {
return 403;
}
Ответ №3:
Это работает для меня, нравится ниже:
set $flag 0;
if ($http_referer = "-") {
set $flag 1;
}
if ($flag = 1) {
return 403;
}