nginx(4)— 正则匹配路径导致get的请求参数丢失

1. 问题

在某个测试环境中,get请求调用时出现下面的异常。

image.png

而应用代码:

@Slf4j
@RestController
public class TestNginx {

    @GetMapping("sendNginx")
    public String sendEvent(@RequestParam("id") String id) {

        log.info(id);
        log.info("请求成功进入");
        return "success"+id;
    }

}

配置文件:

server:
  port: 8089
  servlet:
    context-path: /study

当然,不通过nginx调用服务没有出现这个情况;

2. 解决方案

推测是nginx问题。

nginx.conf配置

user 用户名 用户组;
#worker_processes  1;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  /Users/yexuerui/Documents/nginxlog/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;
        
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

 
    }

    include servers/*;
}

去servers目录下读取conf配置:

问题配置.png
  1. 注意$1和$2表示的含义;
  2. proxy_pass 和upstream的关系;

原因在于,当location存在正则匹配时,get请求会丢失参数

解决方案:
在正则的location的proxy_pass后加?$args。

server {
        listen       8083;
#        server_name test.one.cn;
        access_log  /Users/xxx/Documents/nginxlog/local.log  main;
        error_log  /Users/xxx/Documents/nginxlog/local-error.log  debug_http;
     location ~*^/(273|251)study/(.*) {
      # 不使用改配置upstream中有_tomcat会出现异常。
        proxy_set_header Host $host;
    proxy_pass http://webchat_study_$1/study/$2?$args;
    }
    location /271study {
        proxy_redirect off;
        keepalive_timeout 300s 300s;
        keepalive_requests 100;
        client_max_body_size 300m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 3000s;
        proxy_read_timeout 3000s;
        proxy_send_timeout 3000s;
        proxy_set_header Host $host;
        proxy_set_header Referer $http_referer;
        proxy_set_header Cookie $http_cookie;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://webchat_study_271/study/;
    }
}

upstream webchat_study_271 {
    server 127.0.0.1:8089;
    keepalive 16;
}


upstream webchat_study_273{
    server 127.0.0.1:8089;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 81,640评论 21 356
  • 虚拟主机与请求分发 配置监听端口,中括号为可选参数(server) listen address:port [ d...
    ssk258阅读 4,367评论 0 0
  • 选择SSL证书品牌(CA供应商) 阿里云SSL证书申请:https://www.aliyun.com/produc...
    Liang_JC阅读 3,244评论 0 0
  • I/O模型Nginx介绍Nginx的安装和目录结构Nginx的配置Nginx的编译安装 一、I/O模型 (一)I/...
    哈喽别样阅读 4,436评论 0 4
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 6,406评论 0 9

友情链接更多精彩内容