本文发布于Cylon的收藏册,转载请著名原文链接~

场景

在配置代理后,GET 请求的变量全部失效,配置如下

1
2
3
location /fw {
    proxy_pass http://127.0.0.1:2952;
}

我的需求是,/fw/ 的都发往 2952端口,但实际情况是404,原因为“在没有指定 URI 的情况下,在1.12版本后会传递原有的URI” 这时会导致一个404错误,因为我的后端接口本身就是 /fw/xxx/ 会出现重复

接下来做了一个变量传递

1
2
3
location ~* /fw/(?<section>.*) {
    proxy_pass http://127.0.0.1:2952/fw/$section;
}

这时存在一个问题,就是 GET 请求的变量无法传递过去

解决

nginx 官方给出一个样例,说明了,存在某种情况下,nginx 不会确定请求 URI 中的部分参数

  • 使用正则表达式时
  • 在 localtion 名称内

例如,在这个场景下,proxy_pass 就会忽略原有的请求的URI,而将拼接后的请求转发

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

那么这服务我遇到的问题,nginx官方给出了使用方式

当在 proxy_pass 中需要变量,可以使用 $request_uri;

另外也可以使用 $is_args$args 参数 来保证原有的请求参数被传递

1
2
3
location ~* /fw/(?<section>.*) {
    proxy_pass http://127.0.0.1:2952/fw/$section$is_args$args;
}

$is_args

?” if a request line has arguments, or an empty string otherwise

$args

arguments in the request line

Reference

Alphabetical index of variables

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2023/05/nginx-proxy_pass/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。