文件路径作为路径参数传 /docs/a/b.pdf,请求发出去变成了 /v1/files/docs/a/b.pdf,后端按三段解析,直接 404。编码成 %2F 之后网关又返回 400。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,路径参数里的斜杠属于保留字符,不编码会被当成路径分隔符。编码成 %2F 之后部分网关和容器默认拒绝或者提前解码,应用收到的仍然是被拆开的路径,两种写法都走不通。
碰到「路径参数编码」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
encodeURIComponent('docs/a/b.pdf') // 'docs%2Fa%2Fb.pdf'
curl -i 'https://api.example.com/v1/files/docs%2Fa%2Fb.pdf'
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,路径参数用 encodeURIComponent 编码 斜杠会变成 %2F;网关关掉对 %2F 的拒绝和解码 让原始值传到应用;实在改不动就把这类参数放到查询串里 避开路径分隔符;用带斜杠带中文的样例各跑一遍 确认后端拿到完整值。
最后用这个标准收尾,后端拿到的参数是完整的 docs/a/b.pdf 网关不再返回 400。
