Comments 11
Спасибо, отличная статья!
Как будет выглядеть в мапе такая конструкция?
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";
}
}
Поправьте, если не так.
В секции http:
В конфиге виртуального хоста:
Название переменной $go — от фонаря.
В регулярке необязательно указывать ".*" в начале и в конце.
(?P<1>[3-7]) — создается переменная «1», со значением, которое попадет в фильтр [3-7]
В результате в переменной $go будет номер версии
rewrite ^ — это короткая форма, когда из урла не нужно ничего брать.
map $http_user_agent $go {
"~BPC.\[(?P<1>[3-7])\]" $1;
}
В конфиге виртуального хоста:
location /eset_upd {
if ($go) { rewrite ^ /eset_upd/v$go/update.ver break; }
}
Название переменной $go — от фонаря.
В регулярке необязательно указывать ".*" в начале и в конце.
(?P<1>[3-7]) — создается переменная «1», со значением, которое попадет в фильтр [3-7]
В результате в переменной $go будет номер версии
rewrite ^ — это короткая форма, когда из урла не нужно ничего брать.
UFO just landed and posted this here
Возможно, над этой конструкцией нужно посидеть пару минут и обмозговать :)
Но это уже хитрая логика, которую нужно как-то описывать в конфиге.
Думаю, такая реализация через map читабельнее, чем 3-4 if в location :)
Прошу заметить, что такой подход рассчитан на масштабирование — если вам нужно будет добавить url, с map вам нужно добавить одну строчку.
Но может быть, это можно описать проще, буду рад узнать другой вариант.
Но это уже хитрая логика, которую нужно как-то описывать в конфиге.
Думаю, такая реализация через map читабельнее, чем 3-4 if в location :)
Прошу заметить, что такой подход рассчитан на масштабирование — если вам нужно будет добавить url, с map вам нужно добавить одну строчку.
Но может быть, это можно описать проще, буду рад узнать другой вариант.
Главное — не забывать про default, чтобы всегда было, куда направить запрос.
Подскажите пожалуйста, можно ли написать default так, чтобы запрос шел на случайный сервер а не всегда на один и тот же?
В примере с if
:
if ($http_user_agent ~ "HackYou") {
В соответствующем map
же нет регекспа, нет ли тут ошибки?
Да, вы правы, в if регулярка, а в map "=". Но, раз задача была " блокировать пользователей с user-agent «HackYou»", то работать будет и так и так. Когда условие в map использует несколько переменных, лучше не использовать регулярку. Потому что, в случае регулярки, user-agent "HackYou:POST:/admin/some/url" может привести к неожиданным последствиям :)
Sign up to leave a comment.
Раскрываем возможности map в nginx