К слову, даже в конструкции if ( $http_user_agent ~* (^$|Bot1|Bot2|Bot3) ) { return 444; } регулярка ^$ не работала, не блокировала пустого юзерагента. А вот так работало if ( $http_user_agent = "" ) { return 444; }
Лучше ВЕСЬ конфиг покажите, куда вы это пытаетесь вставить.
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. Как-то так получается, хостер ничего не объяснял, а я в этом не сильна.
Попробуйте "" 1 в map
А может быть, он всё же не пустой в Вашем тесте?
Пустой юзерагент, судя по логам.
К слову, даже в конструкции 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.
Как-то так получается, хостер ничего не объяснял, а я в этом не сильна.
vhosts-includes
Ну вот и косяк, у вас в синтаксисе. А не 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