proxy_pass会覆盖由重写指令更改的URL

时间:2019-01-08 01:47:39

标签: nginx url-rewriting proxypass

根据下面引用的nginx documentation,我了解到proxy_pass指令不会更改URI,而只会将重写的URI传递给服务器。

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

    location /name/ {
        rewrite    /name/([^/]+) /users?name=$1 break;
        proxy_pass http://127.0.0.1/randomstring;
    }
    
         

    在这种情况下,伪指令中指定的URI将被忽略,并且已更改的完整请求URI将传递到服务器。

  •   

但是当我将proxy_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_rewrite被重写为/random_string

有人可以帮助我了解这种行为的原因吗?

1 个答案:

答案 0 :(得分:1)

与以下相同的文档所述:

  
      
  • 在proxy_pass中使用变量时:

    location /name/ {
        proxy_pass http://127.0.0.1$request_uri;
    }
    
         

    在这种情况下,如果在指令中指定了URI,它将照原样传递到服务器,从而替换原始请求URI。

  •   

仅当结果字符串包含URI部分时,才为true。一些例子:

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

结果字符串不包含URI部分,传递给上游服务器的URI为/test_rewrite_upstream

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

结果字符串包含URI部分(请注意$ups_addr变量末尾的斜杠),传递给上游服务器的URI为/

您可以使用$uri变量在proxy_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_string/test_rewrite_upstream

要保留请求参数,请使用$is_args$args变量:

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