Vaily

Рейтинг
25
Регистрация
28.01.2020
livetv #:
Попробуйте "" 1 в map
То что надо!

webinfo #:

А может быть, он всё же не пустой в Вашем тесте?

Пустой юзерагент, судя по логам. 

К слову, даже в конструкции 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 для пустого юзерагента.

Перезагрузила nginx, так как именно его нужно перезагружать в данном случае.

К сожалению, данная конструкция не работает

    map $http_user_agent $limit_bots {
        default 0;
        ~*(Bot1|Bot2|Bot3) 1;
~^$ 1;     }

А именно, не работает ~^$ 1;
Пустым юзерагентам отдается код 200.

Может всё-таки правильно так ~(^$) 1;


LEOnidUKG #:

Лучше ВЕСЬ конфиг покажите, куда вы это пытаетесь вставить.

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.
Как-то так получается, хостер ничего не объяснял, а я в этом не сильна.

LEOnidUKG #:
vhosts-includes
Её как раз и нет.
LEOnidUKG #:

Ну вот и косяк, у вас в синтаксисе. А не 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

1 234 5
Всего: 42