Nginx proxy_pass覆盖由rewrite指令更改的URL

Nginx proxy_pass覆盖由rewrite指令更改的URL,nginx,url-rewriting,proxypass,Nginx,Url Rewriting,Proxypass,从下面引用的nginx中,我了解到proxy\u pass指令不会更改URI,只会将重写的URI传递给服务器 使用rewrite指令在代理位置内更改URI时,此配置将用于处理请求(中断): 在这种情况下,将忽略指令中指定的URI,并将完全更改的请求URI传递给服务器 但是当我将proxy\u pass设置为变量时,URI被覆盖 例如: location /test_rewrite { set $ups_addr http://upstream_server; rewrite

从下面引用的nginx中,我了解到
proxy\u pass
指令不会更改URI,只会将重写的URI传递给服务器

  • 使用rewrite指令在代理位置内更改URI时,此配置将用于处理请求(中断):

    在这种情况下,将忽略指令中指定的URI,并将完全更改的请求URI传递给服务器

但是当我将
proxy\u pass
设置为变量时,URI被覆盖

例如:

location /test_rewrite {
    set $ups_addr http://upstream_server;
    rewrite /test_rewrite /test_rewrite_upstream break;
    proxy_pass $ups_addr/random_string;
}
URI
/test\u rewrite
正在被重写为
/random\u string


有人能帮我理解这种行为的原因吗

同以下文件所述:

  • 在代理过程中使用变量时:

    location /name/ {
        proxy_pass http://127.0.0.1$request_uri;
    }
    
    在这种情况下,如果在指令中指定了URI,它将按原样传递给服务器,替换原始请求URI

只有当结果字符串包含URI部分时,这才是真的。一些例子:

location /test_rewrite {
    set $ups_addr http://upstream_server;
    rewrite /test_rewrite /test_rewrite_upstream break;
    proxy_pass $ups_addr;
}
结果字符串不包含URI部分,传递给上游服务器的URI是
/test\u rewrite\u upstream

location /test_rewrite {
    set $ups_addr http://upstream_server/;
    rewrite /test_rewrite /test_rewrite_upstream break;
    proxy_pass $ups_addr;
}
结果字符串包含一个URI部分(注意
$ups\u addr
变量末尾的尾随斜杠),传递给上游服务器的URI是
/

您可以使用
$uri
变量将重写规则与
proxy\u pass
指令中的自定义uri部分组合起来:

location /test_rewrite {
    set $ups_addr http://upstream_server;
    rewrite /test_rewrite /test_rewrite_upstream break;
    proxy_pass $ups_addr/random_string$uri;
}
在这种情况下,传递给上游服务器的URI是
/random\u string/test\u rewrite\u upper

location /test_rewrite {
    set $ups_addr http://upstream_server/;
    rewrite /test_rewrite /test_rewrite_upstream break;
    proxy_pass $ups_addr;
}
要保留请求参数,请使用和变量:

location /test_rewrite {
    set $ups_addr http://upstream_server;
    rewrite /test_rewrite /test_rewrite_upstream break;
    proxy_pass $ups_addr$uri$is_args$args;
}

@你确定你没有误删除我的报价吗?我标记了一条来自nginx的引文(我的编辑中也包含了该链接),以便将其与OP的文本分开。哦,这是我的错。我正在浏览审查队列,它看起来有点凌乱,所以我试图清理它,但我没有完全意识到上下文。回复。