如何在 ngx_lua 中删除 HTTP 请求头

在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

我不知道错在哪里。谁能帮我找出问题所在?非常感谢任何帮助!

点赞
用户2060502
用户2060502

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

在它们的执行顺序中,阶段包括post-read,server-rewrite,find-config,rewrite,post-rewrite,preaccess,access,post-access,try-files,content,最后是log。

set_by_lua - 阶段:rewrite
echo - 阶段:content
proxy_pass - 阶段:content
header_filter_by_lua - 阶段:output-header-filter

你可能会看到未列出的阶段-output-header-filter。 我还知道output-body-filter。 这些是特殊的阶段,并以不同的方式实现,而不是rewrite,content等阶段。 我找不到这些阶段的文档。任何帮助都欢迎! 但是显然它们不能早于content阶段。

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

set_by_lua 指令
echo 和 proxy_pass 指令
header_filter_by_lua 指令

所以“ngx.header [“RedirectURL”] = nil”实际上是后执行的,对您的回声指令没有影响。

2015-05-22 09:54:31
用户380774
用户380774

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-25 10:22:55
用户5069327
用户5069327

可以使用 API ngx.req.clear_header(header)ngx.req.set_header(header, nil),其中

2017-05-05 06:48:52