NGINX 配置文件是这样的:

server {
    listen       8888 default_server;
    server_name  _;

    resolver 127.0.0.11 ipv6=off;

    set $original_uri "/test";

    location /forward {
        set $original_uri $uri;

        access_by_lua_block {
            ngx.req.read_body()
            local forward_uri = "/forward_pass"
            res = ngx.location.capture(
                forward_uri,
                {
                    args = ngx.var.args,
                    copy_all_vars = true,
                }
            )
        }
    }

    location /forward_pass {
        proxy_pass "http://proxy_to_address$original_uri;
    }
}

当我在请求 http://127.0.0.1/forward 的时候,我发现 /forward_pass 这个 location 中获得到的 $original_uri 总是 /test (在 server 块中设置的值)而不是 /forward (这应该是从 location /forward 中获得的值)。

但是 ngx.location.capture 中我已经将 copy_all_vars 设置为 true 了,为什么没有生效呢?

    下面这行去掉就正常了

    set $original_uri "/test";

    应该是server块的相同变量设置会覆盖之前复制或共享的变量值;

    xlibor 应该是server块的相同变量设置会覆盖之前复制或共享的变量值;

    按照实验来观察,确实是这样的。但是我好奇的是在 server 块中的 set 应该运行于 server-rewrite 阶段,是早于 rewrite 阶段的,为什么值还会被其覆盖呢?

      Write a Reply...