openresty / lua-nginx-module

Embed the Power of Lua into NGINX HTTP servers
https://openresty.org/
11.34k stars 2.03k forks source link

In order to set the headers of the upstream request, I use `ngx.req.set_header` in `rewrite_by_lua_block`, but my upstream endpoint cannot receive such header. #2282

Open Hanoboo opened 9 months ago

Hanoboo commented 9 months ago
          > @agentzh I get a problem here.In order to set the headers of the upstream request, I use `ngx.req.set_header` in `rewrite_by_lua_block`, but my upstream endpoint cannot receive such header. here is my conf.
upstream foo {
        server 127.0.0.1:6666 weight=1;
    }

    server {
        listen 8001;
        location / {
            rewrite_by_lua_block {
                ngx.req.set_header("Connection", "Upgrade")
            }
            proxy_pass http://foo;
        }
    }
    server {
        listen 8002;
        location / {
            proxy_set_header Connection '';
            rewrite_by_lua_block {
                ngx.req.set_header("Connection", "Upgrade")
            }
            proxy_pass http://foo;
        }
    }

request send by 8001 port still cannot get the header "Connection: Upgrade"

Have you solved this problem?I have a similar problem,

Originally posted by @djfsb in https://github.com/openresty/lua-nginx-module/issues/437#issuecomment-948387694

zhuizhuhaomeng commented 9 months ago

I don't know if proxy_pass_header helps.

Hanoboo commented 9 months ago

I don't know if proxy_pass_header helps.

It works,but I want to set the header dynamically in lua code.

antpts commented 9 months ago

You should do something like this:

    upstream foo {
        server 127.0.0.1:6666 weight=1;
    }

    server {
        listen 8001;
        set $dynamicConnectionHeader ''; # default value
        location / {
            rewrite_by_lua_block {
                ngx.var.dynamicConnectionHeader = "Upgrade"
            }
            proxy_pass http://foo;
            proxy_set_header Connection $dynamicConnectionHeader;
        }
    }

    server {
        listen 8002;
        set $dynamicConnectionHeader 'Upgrade'; # default value
        location / {
            rewrite_by_lua_block {
                ngx.var.dynamicConnectionHeader = ""
            }
            proxy_pass http://foo;
            proxy_set_header Connection $dynamicConnectionHeader;
        }
    }
Hanoboo commented 9 months ago

You should do something like this:

    upstream foo {
        server 127.0.0.1:6666 weight=1;
    }

    server {
        listen 8001;
        set $dynamicConnectionHeader ''; # default value
        location / {
            rewrite_by_lua_block {
                ngx.var.dynamicConnectionHeader = "Upgrade"
            }
            proxy_pass http://foo;
            proxy_set_header Connection $dynamicConnectionHeader;
        }
    }

    server {
        listen 8002;
        set $dynamicConnectionHeader 'Upgrade'; # default value
        location / {
            rewrite_by_lua_block {
                ngx.var.dynamicConnectionHeader = ""
            }
            proxy_pass http://foo;
            proxy_set_header Connection $dynamicConnectionHeader;
        }
    }

The request header to be set is obtained dynamically through Lua and cannot be hard-coded with proxy_set_header.

HanadaLee commented 8 months ago

The connection header will be specially processed by nginx proxy (the default header value is "close"). You must use proxy_set_header to set the value of the connection header. You can use Lua to set other headers normally.