以下规则重复了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
全局指定指令不是一个选择。
我的天真方法是简单地用正则表达式扩展第一个位置,在那里提及代理,然后仅指定auth
API 的部分:
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;
}
但由于某种原因,这根本没有触发身份验证。
我怎样才能proxy
针对一组位置仅提及一次(或实际上任何)指令,并且仍然使用类似的附加指令“重载”一些更具体的位置auth_basic
?
答案1
您的问题在 nginx 文档中有所解释。仅使用其中一个位置,它们不会合并在一起:
为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中的出现顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。(http://nginx.org/en/docs/http/ngx_http_core_module.html#location)
作为替代方案,您可以使用include
并将重复的配置行移动到另一个文件 - 例如下面/etc/nginx/snippets/
编辑来自我们评论的嵌套位置的想法:
虽然我不确定这是否 100% 正确,因为我没有测试过,但是,请尝试这样的操作:
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;
}
}
if ($uri ~ ^/api)
另一个选择可能是在正则表达式位置中使用