我们可以从 nginx 中的某个位置跳转到另一个位置吗?

Win*_*hen 3 configuration nginx

我正在努力实现这样的目标:

location /location1/{
    if ($arg_api_key = a_valid_api_key) {
         proxy_pass http://localhost:8080;
    }
    # else jump to location2
}
location /location2/{
    # a lot of validation code here
}
Run Code Online (Sandbox Code Playgroud)

我们如何在 nginx 中做到这一点?或者有更好的处理方法吗?

Ser*_*sov 6

首先,请记住if 是邪恶的,避免将任何东西放在里面rewrite或之外;建议使用和更改用于处理请求的位置的解决方法。returniferror_pagereturn

正如这里已经回答的那样,在 nginx 中重用位置设置的方法是将它们移动到一个单独的文件和块中的include那个文件location

结合这些解决方案会导致:

/etc/nginx/validation_code.conf

# a lot of validation code here
Run Code Online (Sandbox Code Playgroud)

主要配置

location /location1/ {
    error_page 418 = @proxy;
    recursive_error_pages on;
    if ($arg_api_key = a_valid_api_key) {
        return 418;
    }
    include /etc/nginx/validation_code.conf;
}

location /location2/ {
    include /etc/nginx/validation_code.conf;
}

location @proxy {
    proxy_pass http://localhost:8080;
}
Run Code Online (Sandbox Code Playgroud)

您还可以考虑为验证代码使用命名位置,而不是创建单独的文件;但是,您需要一些技巧来切换到该命名位置——例如,另一个error_page/return对,或类似的

    try_files /nonexistent @validation
Run Code Online (Sandbox Code Playgroud)

  • error_page 418 = @proxy; -> 它对我有用。但是,所有参数都丢失了。有没有办法用所有参数来做到这一点? (2认同)