我有一个示例配置:
upstream content {
server 127.0.0.1:4001;
}
server {
listen 4000;
location /test-auth {
add_header X-Test "test value";
return 200;
}
location /proxy {
add_header "X-Test1" "test1";
auth_request /test-auth;
auth_request_set $test $upstream_http_x_test;
auth_request_set $test2 $upstream_status;
proxy_pass http://content?test=$test&test2=$test2;
proxy_pass_request_body off;
add_header X-Test $test;
add_header X-Test2 $test2;
}
}
server {
listen 4001;
add_header X-Test3 "test3";
return 200 "test response $args";
}
Run Code Online (Sandbox Code Playgroud)
我想X-Test在请求时将标头从身份验证位置传递到浏览器/proxy。auth_request_set这应该由指令通过拉动变量值来完成$upstream_http_x_test。但当在 auth 端点输出中设置标头时,它始终为空。直接访问时/test-auth,它出现在输出中。但我无法在该/proxy位置获取它。此外,$upstream_status应该始终存在显示身份验证请求状态,但它也是空的。当我向 发出请求时/proxy,我只得到这些:
X-Test3: test3
X-Test1: test1
test response test=&test2=
Run Code Online (Sandbox Code Playgroud)
但我还需要使用来自身份验证请求的数据和内容部分中的相应值填充标头X-Test。X-Test2
端点/test-auth被正确调用。如果我在其中返回 401,则请求也会/proxy失败并返回 401。
我做错了什么?
auth_request_set变量在块内部不可访问location,但在内部可用access_by_lua,试试这个:
access_by_lua_block {
ngx.header["X-Test2"] = ngx.var["test2"]
}
Run Code Online (Sandbox Code Playgroud)