拦截所有nginx位置以进行身份验证

拦截所有nginx位置以进行身份验证,nginx,Nginx,我想知道如何在一个位置为每个位置显式设置身份验证检查。像下面这样做似乎容易出错(遗漏条目、打字错误、不必要的重复等) nginx.conf location / { auth_request /someAuth; auth_request_set $someVar $someOtherVar; proxy_pass https://somewhere.com:1234; proxy_set_header X-Forwarded-For $remote_addr; } location

我想知道如何在一个位置为每个位置显式设置身份验证检查。像下面这样做似乎容易出错(遗漏条目、打字错误、不必要的重复等)

nginx.conf

location / {
 auth_request /someAuth;
 auth_request_set $someVar $someOtherVar;
 proxy_pass https://somewhere.com:1234;
 proxy_set_header X-Forwarded-For $remote_addr;
}

location /foo {
 auth_request /someAuth;
 auth_request_set $someVar $someOtherVar;
 proxy_pass https://somewhereElse.com:6578;
 proxy_set_header X-Forwarded-For $remote_addr;
}

location /bar {
 auth_request /someAuth;
 auth_request_set $someVar $someOtherVar;
 proxy_pass https://somewhereOther.com:9876;
 proxy_set_header X-Forwarded-For $remote_addr;
}

可能以如下方式使用
map
指令

map $uri $proxy {
    ~^/foo    https://somewhereElse.com:6578;
    ~^/bar    https://somewhereOther.com:9876;
    default   https://somewhere.com:1234;
}
server {
    ...
    location / {
        auth_request /someAuth;
        auth_request_set $someVar $someOtherVar;
        proxy_pass $proxy;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

请注意,这样的配置需要一个指令。

可能以如下方式使用
map
指令

map $uri $proxy {
    ~^/foo    https://somewhereElse.com:6578;
    ~^/bar    https://somewhereOther.com:9876;
    default   https://somewhere.com:1234;
}
server {
    ...
    location / {
        auth_request /someAuth;
        auth_request_set $someVar $someOtherVar;
        proxy_pass $proxy;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

请注意,这样的配置需要一个指令。

我想我有一个坏例子,所有参数在位置之间都是相同的。如果它们都是相同的,那么地图就可以工作,但我的现实世界问题却不同ones@ekjcfn3902039您可以使用几个
map
块从
$uri
nginx内部变量获取各种参数。也许如果你发布你的真实配置,我可以建议一些更优化的解决方案。我有点希望在继续到真实位置之前,能有一个像位置拦截器一样的单行线。我想地图是最好的选择?@ekjcfn3902039我认为
map
是最好的选择。我想我有一个糟糕的例子,所有的参数在不同的位置都是相同的。如果它们都是相同的,那么地图就可以工作,但我的现实世界问题却不同ones@ekjcfn3902039您可以使用几个
map
块从
$uri
nginx内部变量获取各种参数。也许如果你发布你的真实配置,我可以建议一些更优化的解决方案。我有点希望在继续到真实位置之前,能有一个像位置拦截器一样的单行线。我想地图是最好的选择?@ekjcfn3902039我认为
地图
是最好的选择。