You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Docker+Nginx环境下路径参数编码致400错误排查

问题原因与解决方案

核心问题

问题出在Nginx的URL解码行为:
Nginx默认会自动解码URL中的编码字符(比如把%22还原为双引号"),然后将包含未编码特殊字符的路径转发给后端Tomcat。而Spring Boot 3.0.9默认使用的Tomcat 10,其安全配置默认禁止路径中出现未编码的双引号,因此直接返回400 Bad Request;而直接访问Docker容器时,客户端发送的是编码后的%22,Tomcat会正常解码处理,不会触发非法字符校验。

另外你的Nginx转发路径存在匹配问题:从URL示例看,直接访问后端的路径是/test/%22%22,但通过Nginx的请求是/test/test/%22%22,经当前配置转发后,后端收到的路径是/test/test/%22%22,这和Spring接口/test/{params}的路径规则(默认@PathVariable仅匹配单个路径段)不匹配,但这只会导致404,不是你当前遇到400的核心原因。

解决方案

方案一:让Nginx保持URL原始编码转发(推荐)

修改Nginx的location配置,使用变量传递请求URI,避免自动解码:

location /test/ {
    # 去除Nginx路径前缀/test/,转发到后端的/test/路径
    rewrite ^/test/(.*)$ /test/$1 break;
    proxy_pass http://test;
    # 传递原始请求URI,保留编码状态
    proxy_set_header X-Original-URI $request_uri;
}

或者更简洁的写法:

location /test/ {
    proxy_pass http://test$uri$is_args$args;
}

方案二:配置Tomcat允许路径中的双引号字符(不推荐)

在Spring Boot配置文件(application.properties或application.yml)中添加Tomcat宽松字符配置:

server.tomcat.relaxed-path-chars="
server.tomcat.relaxed-query-chars="

此方法会降低请求安全性,仅作为临时替代方案。

额外建议

检查请求URL的合理性:如果期望通过Nginx访问的路径和直接访问后端一致(如http://22.22.22.22/test/%22%22),当前Nginx的location /test/配置即可正常转发;如果确实需要使用/test/test/%22%22这类路径,需调整rewrite规则,去掉多余的test/前缀,确保转发后的路径匹配Spring接口的/test/{params}规则。

内容的提问来源于stack exchange,提问作者ostr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:13:19