А может быть, он всё же не пустой в Вашем тесте?
Пустой юзерагент, судя по логам.
К слову, даже в конструкции if ( $http_user_agent ~* (^$|Bot1|Bot2|Bot3) ) { return 444; }регулярка ^$ не работала, не блокировала пустого юзерагента. А вот так работало if ( $http_user_agent = "" ) { return 444; }
Пробовала так:map $http_user_agent $limit_bots {
default 0; ~*(Bot1|Bot2|Bot3) 1; ~^$ 1; }
и так:map $http_user_agent $limit_bots {
default 0; ~*(Bot1|Bot2|Bot3) 1; ~(^$) 1; }
и вот так: map $http_user_agent $limit_bots { default 0; ~*( ^$ |Bot1|Bot2|Bot3) 1; }
Во всех вариантах ответ 200 для пустого юзерагента.
К сожалению, данная конструкция не работает
map $http_user_agent $limit_bots { default 0; ~*(Bot1|Bot2|Bot3) 1; ~^$ 1; }
А именно, не работает ~^$ 1;Пустым юзерагентам отдается код 200.
Может всё-таки правильно так ~(^$) 1; ?
Лучше ВЕСЬ конфиг покажите, куда вы это пытаетесь вставить.
Nginx пишет чисто на человеческом, что ТУДА куда вы вставляете этого делать нельзя.
Сам nginx.conf хостер не изменял, лишь добавил map $http_user_agent $limit_bots в секцию http. Само же правило if ($limit_bots = 1) { return 444; } вынес в какой-то шаблон, имя/директория файла шаблона мне неизвестны.
И теперь, в /etc/nginx/conf.d/domains/хостнейм.conf правило if ($limit_bots = 1) { return 444; } выводится автоматом в секции server. Как-то так получается, хостер ничего не объяснял, а я в этом не сильна.
Ну вот и косяк, у вас в синтаксисе. А не if запретил nginx. Он всегда будет работать т.к. даже при map вам надо будет проверять переменную через if
Правильный код:
if ($http_user_agent ~* (bot1|bot2|bot3) ) {
return 444;
}
Было так
if ($http_user_agent ~* bot1|bot2|bot3 ) { return 444; }
Успешно работало на старом сервере, переехала на новый и if вызвал ошибку. Хостер сам предложил использовать map.
LEOnidUKG #:
Я вам написал оптимальный вариант.
Я без какой-либо претензии. Решила уточнить на всякий случай. Спасибо Вам за оперативный отклик и подсказку!
Но сейчас уже другой конфиг сервера. Блокирую в /etc/nginx/nginx.conf в секции http, map $http_user_agent $limit_bots {...}
Поэтому использую map