• 欢迎访问VPS岛网站,国外VPS,国内VPS,国外服务器,国内服务器,服务器主机,测评及优惠码,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站 QQ群

坑!url中含有中文导致nginx 400。锅是tomcat的

Nginx相关 mb5fed6ec4336ce 45次浏览 已收录 0个评论

坑!url中含有中文导致nginx 400。锅是tomcat的

不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

起因:用户在请求接口的时候,请求url中携带中文参数,导致返回400。查询日志发现报错:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 。

原因:Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。【为了堵洞?(  ̄ー ̄)】

具体类的坐标:org.apache.tomcat.util.http.parser.HttpParser#IS_NOT_REQUEST_TARGET[]

坑!url中含有中文导致nginx 400。锅是tomcat的

大体意思就是,有以下字符都过不去(对应10进制ASCII看):

  • 键盘上那些控制键:(<32或者=127)
  • 非英文字符(>127)
  • 空格(32)
  • 双引号(34)
  • #(35)
  • <(60)
  • >(62)
  • 反斜杠(92)
  • ^(94)
  • TAB上面那个键(96)
  • {(123)
  • }(124)
    这个问题碰到了其实还是很恶心的,业务肯定是改不动。提供5个解决方法如下。

解决办法1
配置tomcat的catalina.properties

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
但这种方法只适合对应英文,如果为中文就不行。

如果有?和&这些符号,那么都得写进去。


tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}?&

解决办法2
最简单粗暴方法,降低tomcat版本。此方法比较快,也不需修改配置。

解决办法3
对相应的参数进行编码,就是将所有的参数都进行urlencode。

解决方法4
选择另外的参数传递方法,比如post或者localStorage。

解决方法5

选择另外的容器,如jetty。不过配置文件需要修改,accesslog配置比tomcat麻烦。另:undertow也报400。

tomcat真贴心呀,给我找了一天的活。


VPS岛 的文章和资源来自互联网,仅作为参考资料,如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。丨 转载请注明坑!url中含有中文导致nginx 400。锅是tomcat的
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址