Pull to refresh

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";
	}
}

Поправьте, если не так.
Да, только map должен быть в секции http.
И после $http_user_agent нужно указать свою переменную, в которую и запишется выбранное значение.
В секции http:
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 вам нужно добавить одну строчку.
Но может быть, это можно описать проще, буду рад узнать другой вариант.

Главное — не забывать про default, чтобы всегда было, куда направить запрос.

Подскажите пожалуйста, можно ли написать default так, чтобы запрос шел на случайный сервер а не всегда на один и тот же?

Да, вам нужно просто описать upstream default_php_backend, включив в него несколько серверов.

В примере с 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.

Articles