2016-07-26 107 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

有两种更好的解决方案。其中一个:'location ^〜/ dashboard {...}',第二个'location〜^(/ website |/login){...}' –

+0

我认为“丑陋”解决方案仍然是最好的。 :) –