如何解决Nginx auth_request指令和带有设置的位置块的问题
我在服务器部分定义了一个名为$ host_header的变量,该变量在位置级别被覆盖。由于所有设置都在重写阶段完成,因此在任何proxy_pass指令之前都可以正常工作。最终,“ test-nginx”的proxy_pass与主机标头“ location level”一起使用。但是,当我向位置块添加auth_request指令(在我的示例中,该指令始终返回200并且它在访问阶段运行,因此在完成所有设置之后)时,(魔术就来了),proxy_pass与Host标头“ server级”,我认为这是一个错误。 在nginx 1.19.1上
这是示例代码。任何想法为什么会发生?是错误还是我做错了?
server {
listen 80;
server_name "local.main.server";
set $host_header "server level";
proxy_set_header Host $host_header;
location /test {
auth_request /auth;
set $host_header "location level";
# call backend server
proxy_pass http://test-nginx;
}
location = /auth {
internal;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
# this simply return 200
proxy_pass http://test-nginx;
}
}
解决方法
对于这个奇怪的问题,我找到了一个非常好的解决方法。通过使用NJS模块中的“ js_set”指令,我们可以创建另一个变量$ target_host_header并为其分配getTargetHeader函数的结果:
...
load_module /usr/lib/nginx/modules/ngx_http_js_module.so;
...
http {
...
js_import NJS from /path/to/file/with/functions.js;
...
js_set $target_header NJS.getTargetHeader;
proxy_set_header Host $target_header;
...
}
仍然在服务器部分,我们可以设置$ host_header变量,但是在一个位置内,我们必须设置其他变量$ proxy_host_header:
server {
...
set $host_header "server level";
location /test {
set $proxy_host_header "location level";
proxy_pass http://SOMEENDPOINT;
}
...
}
这是njs函数:
function getTargetHostHeader(r) {
if (r.variables.hasOwnProperty('proxy_host_header') && r.variables.proxy_host_header.length > 0) {
return r.variables.proxy_host_header;
} else {
return r.variables.host_header;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。