2016-07-26 6 views
0

У меня есть следующая конфигурация на Nginx.Nginx конфликтует с несколькими местоположениями

location ~ (/website|/login) { 
    #proxy to server A 
    ... 
} 

location /dashboard { 
    #proxy to server B 
    .... 
} 

Конфликт возникает, когда запросы делается для /dashboard/login, он входит в server A вместо server B, что я хочу.

уродливое решение, которое отлично работает:

location /website { 
    #proxy to server A 
    ... 
} 

location /login { 
    #proxy to server A 
    ... 
} 

location /dashboard { 
    #proxy to server B 
    .... 
} 

Как я могу изменить эту конфигурацию/приборную панель/Логин совпадает с определением #b? Я хочу избежать повторяющегося кода, который я использовал для уродливого решения.

+2

Вы ошибаетесь в отношении уродства. Решение прост и эффективен, в то время как ваша первоначальная конфигурация является уродливой и подверженной ошибкам –

+1

Чтобы избежать самовосстановления, используйте директиву 'include' –

ответ

0

Ваше «уродливое» решение на самом деле кратким и понятным. Это не связано с регулярной магией, которую трудно понять и изменить.

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

< ...> Nginx сначала проверяет расположение определяется с помощью префиксов. < ...> Затем регулярные выражения проверяются в порядке их появления в файле конфигурации. Поиск регулярных выражений заканчивается в первом совпадении, и используется соответствующая конфигурация.

Но вот решение только с двумя блоками.

# Location order is important! 

location ~ /dashboard { 
    #proxy to server B 
} 

location ~ (/website|/login) { 
    #proxy to server A 
} 
+0

Существует два лучших решения. One: 'location^~/dashboard {...}', second 'location ~^(/ website |/login) {...}' –

+0

Я думаю, что «уродливое» решение по-прежнему остается лучшим. :) –