前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >坑!url中含有中文导致nginx 400。锅是tomcat的

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

作者头像
xjjdog
发布2020-07-21 13:57:46
3K0
发布2020-07-21 13:57:46
举报
文章被收录于专栏:架构专题

不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号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[]

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

  • 键盘上那些控制键:(<32或者=127)
  • 非英文字符(>127)
  • 空格(32)
  • 双引号(34)
  • #(35)
  • <(60)
  • >(62)
  • 反斜杠(92)
  • ^(94)
  • TAB上面那个键(96)
  • {(123)
  • }(124)

这个问题碰到了其实还是很恶心的,业务肯定是改不动。提供5个解决方法如下。

解决办法1

配置tomcat的catalina.properties

代码语言:javascript
复制
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

但这种方法只适合对应英文,如果为中文就不行。

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

代码语言:javascript
复制
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}?&

解决办法2

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

解决办法3

对相应的参数进行编码,就是将所有的参数都进行urlencode。

解决方法4

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

解决方法5

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

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

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

后台回复“加群”,带你进入高手如云交流群

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小姐姐味道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决办法1
  • 解决办法2
  • 解决办法3
  • 解决方法4
  • 解决方法5
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档