Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
location /eset_upd {
if ($http_user_agent ~ .*BPC.[3].*) {
rewrite ^(.*) /eset_upd/v3/update.ver break;
}
if ($http_user_agent ~ .*BPC.[4].*) {
rewrite ^(.*) /eset_upd/v4/update.ver break;
}
if ($http_user_agent ~ .*BPC.[5].*) {
rewrite ^(.*) /eset_upd/v5/update.ver break;
}
if ($http_user_agent ~ .*BPC.[6].*) {
rewrite ^(.*) /eset_upd/v6/update.ver break;
}
if ($http_user_agent ~ .*BPC.[7].*) {
rewrite ^(.*) /eset_upd/v7/update.ver break;
}
location /eset_upd {
map "$http_user_agent rewrite ^(.*) {
".*BPC.[3].*" "/eset_upd/v3/update.ver";
".*BPC.[4].*" "/eset_upd/v4/update.ver";
".*BPC.[5].*" "/eset_upd/v5/update.ver";
".*BPC.[6].*" "/eset_upd/v6/update.ver";
".*BPC.[7].*" "/eset_upd/v7/update.ver";
}
}
map $http_user_agent $go {
"~BPC.\[(?P<1>[3-7])\]" $1;
}
location /eset_upd {
if ($go) { rewrite ^ /eset_upd/v$go/update.ver break; }
}
Главное — не забывать про default, чтобы всегда было, куда направить запрос.
Подскажите пожалуйста, можно ли написать default так, чтобы запрос шел на случайный сервер а не всегда на один и тот же?
В примере с if:
if ($http_user_agent ~ "HackYou") {В соответствующем map же нет регекспа, нет ли тут ошибки?
Да, вы правы, в if регулярка, а в map "=". Но, раз задача была " блокировать пользователей с user-agent «HackYou»", то работать будет и так и так. Когда условие в map использует несколько переменных, лучше не использовать регулярку. Потому что, в случае регулярки, user-agent "HackYou:POST:/admin/some/url" может привести к неожиданным последствиям :)
Раскрываем возможности map в nginx