我使用auth_request模块(http://nginx.org/en/docs/http/ngx_http_auth_request_module.html(。我的nginx配置:
auth_request /auth;
auth_request_set $backend_status $upstream_status;
location / {
proxy_pass http://unicorn;
error_page 401 @auth;
}
location = /auth {
internal;
proxy_pass https://proxy_pass_url;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
location @auth {
if ($backend_status = "401") {
return 302 https://proxy_pass_url/login? origin=$scheme://$http_host$request_uri;
}
}
但是我的重定向不起作用。我的配置有什么问题?
auth_request_set
变量在if
块中无法访问,但在提供if语句的access_by_lua
中可用。
access_by_lua_block {
if ngx.var["backend_status"] == "401" then
return ngx.redirect("https://proxy_pass_url/login? origin=" .. $scheme .. "://" .. $http_host .. $request_uri)
end
}
你的意思是它不起作用?我假设您没有重定向,但是请求的状态代码是什么?/auth 子请求的状态代码是什么?你在哪个nginx上测试它?您是否检查了错误/访问日志?
我问是因为我拿了你的代码,在 Nginx 1.19.1 上运行并且效果很好。当/auth 子请求返回 401 错误时,我正在通过@auth位置重定向。我们可以在这里改进的一件事。你不需要检查 $backend_status 变量是否等于 401,如果 Nginx 将请求传递到@auth位置,这意味着我们有来自/auth 的 401 :)
溴,皮奥特