3

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

我不知道错在哪里。谁能帮我弄清楚?谢谢你的帮助!

4

3 回答 3

6

ngx.req.clear_header

location /apiproxytest {
    set_by_lua $redirectURL '
        local url = ngx.req.get_headers()["RedirectURL"]
        ngx.req.clear_header("RedirectURL")

        return url
    ';

    proxy_pass $redirectURL;
}
于 2015-05-25T10:22:55.940 回答
3

这是常见的错误。您认为 nginx 指令的执行顺序与配置文件中的顺序相同。nginx配置文件的处理有很多阶段。很好,但很长的解释:Nginx 指令执行顺序

按照执行顺序,这些阶段是读取后、服务器重写、查找配置、重写、重写后、预访问、访问、访问后、尝试文件、内容,最后是日志。

set_by_lua - phase: rewrite
echo - phase: content
proxy_pass - phase: content
header_filter_by_lua - phase: output-header-filter

您可能会看到未列出的阶段 - output-header-filter。我也知道输出体过滤器。这些是特殊阶段,并以不同的方式实现,然后是重写、连接等阶段。我找不到这些阶段的文档。欢迎任何帮助!但显然他们不能早于内容阶段。

您的配置指令按下一个顺序执行:

set_by_lua directives
echo and proxy_pass directives
header_filter_by_lua directives

所以ngx.header["RedirectURL"] = nil稍后才真正执行,并且对您的 echo 指令没有影响。

于 2015-05-22T09:54:31.227 回答
1

您可以使用 APIngx.req.clear_header(header)ngx.req.set_header(header, nil)

于 2017-05-05T06:48:52.890 回答