与一组网址匹配的Nginx位置块

时间:2017-02-15 14:26:20

标签: nginx

我的应用程序中有一个IdentityAccess控制器,它包含四种操作方法:

  1. 登录
  2. 检查
  3. 刷新
  4. 撤销
  5. 所以,我可以通过localhost / IdentityAccess / login等访问这些操作方法。此外,我实现了Lua验证,这应该保护一些路由。例如,这就是我保护所有来到store控制器的请求的保护方式:

    location /store/ {
        rewrite_by_lua_file 'jwt-validation.lua';
        proxy_pass http://store_server/
        ...
    }
    

    但整个问题在于IdentityAccess控制器。在此控制器中,我想要保护除login之外的所有操作方法。此外,我不想创建一大堆精确位置,如location /IdentityAccess/check { ...location /IdentityAccess/refresh { ...等,并应用于每个位置Lua脚本。我想要的是某种与动作方法列表相匹配的正则表达式 - 检查,刷新和撤销 - 并且会忽略登录操作方法。但我不知道实现这一目标的最佳方法是什么。

1 个答案:

答案 0 :(得分:2)

选择具有最长匹配前缀的前缀位置。所以你需要的是定义location /IdentityAction/ { rewrite_by_lua_file 'jwt-validation.lua'; proxy_pass http://store_server; ... } location /IdentityAction/login/ { proxy_pass http://store_server; ... } 位置而不进行jwt验证。

location ~ ^/IdentityAction/login/$ {
    # first location in file
    proxy_pass http://store_server;
}

location ~ ^/IdentityAction/$ {
    # second location in file
    rewrite_by_lua_file 'jwt-validation.lua';
    proxy_pass http://store_server;
}

当然,这也可以通过regexp位置完成,但在这种情况下,文件中位置的位置很重要,因为选择了第一个匹配(但对于前缀位置位置并不重要,因为所选位置的最佳匹配)。使用正则表达式,它看起来像

ArrayList::new