避免对不同地点的指令重复?

避免对不同地点的指令重复?

以下规则重复了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全局指定指令不是一个选择。

我的天真方法是简单地用正则表达式扩展第一个位置,在那里提及代理,然后仅指定authAPI 的部分:

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)另一个选择可能是在正则表达式位置中使用

相关内容