http请求标头中有一个名为“RedirectURL”的参数。我想在ngx_lua中将其删除,然后将此请求发送到RedirectURL,这里是nginx.conf中的一些片段
location /apiproxytest {
set_by_lua $redirectURL '
return ngx.req.get_headers()["RedirectURL"]
';
header_filter_by_lua '
ngx.header["RedirectURL"] = nil;
';
echo "1:" $redirectURL;
set_by_lua $redirectURL2 '
return ngx.req.get_headers()["RedirectURL"]
';
echo "2:" $redirectURL2;
proxy_pass $redirectURL;
}
当我测试它时使用
curl --header "RedirectURL:www.google.com" xx.xx.xx.xx:xx/apiproxytest
我得到结果:
1: www.google.com
2: www.google.com
我不知道错在哪里。谁能帮我搞清楚? 谢谢你的帮助!
答案 0 :(得分:3)
这是通常的错误。您认为nginx指令的执行顺序与配置文件中的顺序相同。 处理nginx配置文件有很多阶段。很好,但很长的解释:Nginx directive execution order
在执行顺序中,阶段是后读,服务器重写, find-config,rewrite,post-rewrite,preaccess,access,post-access, 尝试文件,内容,最后登录。
set_by_lua - phase: rewrite
echo - phase: content
proxy_pass - phase: content
header_filter_by_lua - phase: output-header-filter
您可能会看到未列出的阶段 - 输出标头过滤器。 我也知道输出体滤波器。 这些是特殊阶段,以不同的方式实施,然后重写,反对等阶段。 我找不到这些阶段的文档。欢迎任何帮助! 但显然他们不能早于内容阶段。
您的配置指令按下一个顺序执行:
set_by_lua directives
echo and proxy_pass directives
header_filter_by_lua directives
所以ngx.header["RedirectURL"] = nil
后来真的执行了,对你的echo指令没有任何影响。
答案 1 :(得分:3)
location /apiproxytest {
set_by_lua $redirectURL '
local url = ngx.req.get_headers()["RedirectURL"]
ngx.req.clear_header("RedirectURL")
return url
';
proxy_pass $redirectURL;
}
答案 2 :(得分:0)
您可以使用API ngx.req.clear_header(header)
或ngx.req.set_header(header, nil)
,即