好像是用的大括号{}有问题。
我尝试通过添加 relaxedPathChars='{ | 更改 server.xml 中的连接器}' relaxedQueryChars='{ | }'
但没有解决问题。还向同一连接器添加了 URIEncoding="UTF-8"useBodyEncodingForURI="true"
。
我无法自己更改大括号,因为它来自外部脚本,而且我无法事先更改 url 字符串,所以我试图更改 tomcat 中的设置以允许 {} 但到目前为止运气不好。
这一切都在 nginx 网络服务器上,如果有帮助的话。
最佳答案
较新版本的 Tomcat 正在尝试遵守 RFC7230/RFC3986(限制可以在 URL 中使用哪些字符)。但这会导致一些较旧的应用程序出现问题,现在有一种方法可以覆盖这些规则。 (参见此处的讨论:https://bz.apache.org/bugzilla/show_bug.cgi?id=62273)
在最新版本的 Tomcat 中,此行为发生了一些变化。
在当前版本(8.0.53、8.5.34、9.0.12)中,您可以在 server.xml 中使用连接器的 relaxedPathChars 和 relaxedQueryChars 属性:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="60000"
relaxedQueryChars='^{}|[]'
redirectPort="8443" />
在旧版本中,此行为由现已弃用(!)系统属性 tomcat.util.http.parser.HttpParser.requestTargetAllow ( https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html )
请注意,有些 Tomcat 版本实现了严格的规则,但还没有此选项。
(我还看到了较旧的 Tomcat 版本,但已打补丁 - 此行为已更改以解决可能的漏洞 - http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6816)
关于tomcat 8在处理get请求时抛出400错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52502686/