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

我们可以从 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
}

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

答案1

首先,请记住if 是邪恶的并避免在rewritereturn里面放置任何东西if;建议的解决方法是使用error_pagereturn来更改用于处理请求的位置。

作为已经在这里回答了,在 nginx 中重用位置设置的方法是将它们移动到单独的文件中,然后include将该文件放在您的location块中。

结合这些解决方案可获得以下效果:

/etc/nginx/validation_code.conf

# a lot of validation code here

主要配置

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;
}

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

    try_files /nonexistent @validation

相关内容