auth_request 没有阻止返回指令,无法返回状态?

auth_request 没有阻止返回指令,无法返回状态?

这是一个简单的场景。我们声明了以下位置来测试服务器是否可以访问:

location = /ping {
    return 204;
}

我们决定使用与其他端点相同的 auth_request 逻辑来保护它,这些逻辑有效且包含在同一块中server {}。我们只是添加了auth_request指令,但两次尝试都失败了:

即使 auth_request 返回 401/403,这个也总是返回 204:

location = /ping {
    auth_request /validate;
    return 204;
}

这有点令人惊讶,因为auth_request 的记录行为,我以为它会停止处理进一步的指令:

如果子请求返回2xx响应码,则允许访问。如果返回401或403,则拒绝访问并显示相应的错误码。

第二次尝试直接返回 auth_request 的状态也没有成功:

location = /ping {​​​​​​​​
    auth_request /validate;
    auth_request_set    $auth_status        $upstream_status;
    return $auth_status;
}​​​​​​​​

因为它失败了

[emerg] /etc/nginx/conf.d/default.conf:157 中的返回代码“$auth_status”无效

这个问题似乎与我使用return? 有关,我见过nginx auth_request如何返回后端状态代码但它似乎没有解决我的情况。

答案1

来自nginx 文档return

停止处理并将指定的代码返回给客户端。

重要的是,“停止处理”不会在遇到指令时发生,因此无论子请求的结果如何,返回总是会发生。

目的只是为了保护我的/ping端点,这个小小的修改是有效的:try_files当然要受制于 ,auth_request因为路径_不存在,所以当auth_request通过 时它会失败,但如果不存在则返回 401 或 403:

location = /ping {
    auth_request /validate;
    try_files _ =204;
}

相关内容