避免在不同地点重复指令?

以下规则重复了proxy指令,我宁愿只提及一次:

 location /view/ { # Duplicated! proxy_pass http://127.0.0.1:9292; proxy_set_header Host $host; } location /api/ { # Duplicated! proxy_pass http://127.0.0.1:9292; proxy_set_header Host $host; auth_basic "esqulino Testbetrieb"; auth_basic_user_file /srv/svn/users.conf; } 

那么我在这里提到的位置有更多的位置,所以全局指定proxy指令不是一个选项。

我天真的做法是简单地用正则expression式扩展第一个位置,在那里提到代理,然后只指定API的auth部分:

 location ~ /(api|view)/ { proxy_pass http://127.0.0.1:9292; proxy_set_header Host $host; } location /api/ { auth_basic "esqulino Testbetrieb"; auth_basic_user_file /srv/svn/users.conf; } 

但由于某种原因,这根本不触发authentication。

我怎么能提到proxy (或实际上任何)只有一个位置的指令一次,仍然“超载”一些更具体的地点,像auth_basic额外的指令?

你的问题在nginx文档中有解释。 只有其中一个位置被使用,它们不会合并在一起:

要find匹配给定请求的位置,nginx首先检查使用前缀string(前缀位置)定义的位置。 其中,匹配前缀最长的位置被选中并记住。 然后按照它们在configuration文件中出现的顺序检查正则expression式。 正则expression式的search在第一次匹配时终止,并使用相应的configuration。 如果找不到正则expression式的匹配,则使用先前记住的前缀位置的configuration。 ( http://nginx.org/en/docs/http/ngx_http_core_module.html#location

作为替代scheme,您可以使用include并将重复的configuration行移动到另一个文件 – 例如/etc/nginx/snippets/

编辑从我们的意见嵌套位置的想法:

虽然我不确定这是否是100%正确的,我没有testing,但是,尝试这样的事情:

 location ~ /(view|api) { proxy_pass http://127.0.0.1:9292; proxy_set_header Host $host; location /api/ { auth_basic "esqulino Testbetrieb"; auth_basic_user_file /srv/svn/users.conf; } } 

另一种select是在正则expression式中使用if ($uri ~ ^/api)