nginx+tomcat的网页,在手机上经过浏览器能够正常访问,可是在本身的app的webview中访问就报400。查了访问日志,每次app中访问该页面,tomcat中就出现一个GET null的申请,但不知道怎么来的,真是百思不得其解。html
直到在网上找到这个:《记一次nginx+tomcat8请求400错误的坑》,这个跟个人问题应该是如出一辙。核心缘由就是申请中包含了特殊字符|{}或者空host参数。估摸着浏览器对这种字符进行了转码,而app的webview控件处理过于简单,而后被tomcat拒绝了。java
记录下,备用。nginx
client_header_buffer_size
和large_client_header_buffers
都调大,可缓解此问题。proxy_set_header Host $host
,空Host头就传给了后端。然而,在http 1.1的规范中,Host只要出现空,就会返回400,因此出现了这个故障。而对于须要在Host字段里带上端口信息的,则仍须要配置proxy_set_header Host $host:$server_port
。server_name _;
<Valve className="org.apache.catalina.valves.RemoteIpValve" portHeader="x-forwarded-port" remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" />
catalina.properties
中添加 tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
可是只支持7.0.76, 8.0.42, 8.5.12 以后的版本(这些版本以后支持设置上述属性)须要强调的是app中访问错误信息中有一行:java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986web