Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC39
目錄
背景
在將tomcat升級到7.0.81版後,發現系統的有些功能不能使用了,查詢日誌發現是有些地址直接被tomcat認為存在不合法字元,返回HTTP 400錯誤響應,錯入資訊如下:
原因分析
經瞭解,這個問題是高版本tomcat中的新特性:就是嚴格按照 RFC 3986規範進行訪問解析,而 RFC 3986規範定義了Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元(RFC3986中指定了以下字元為保留字元:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我們的系統在通過地址傳參時,在url中傳了一段json,傳入的引數中有"{"不在RFC3986中的保留欄位中,所以會報這個錯。
根據(https://bz.apache.org/bugzilla/show_bug.cgi?id=60594) ,從以下版本開始,有配置項能夠關閉/配置這個行為:
8.5.x系列的:8.5.12 onwards
8.0.x系列的:8.0.42 onwards
7.0.x系列的:7.0.76 onwards
處理方法
.../conf/catalina.properties中,找到最後註釋掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow=| ,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行
------2018.01.30 新增--------
按照上面的方法處理好後,在非IE瀏覽器上訪問,是沒有問題了。但若是在IE瀏覽器上進行訪問,這個錯誤還是會出現,在IE上訪問出現這個錯誤的原因:因為url的引數json中有雙引號,火狐和谷歌瀏覽器會自動對url進行轉碼,但IE不會
這種情況的處理方法:
給系統配置方向代理伺服器,通過反向代理伺服器進行urlrewrite,手動取出各個json的資料,手動將雙引號進行轉碼為%22:
具體方式如下:
編輯 Apache安裝目錄/conf/httpd.conf, 在配置MAS反向代理的前面新增如下資訊:
RewriteCond %{QUERY_STRING} json
RewriteCond %{QUERY_STRING} !msKey
RewriteCond %{QUERY_STRING} msInfo
RewriteCond %{QUERY_STRING} player
RewriteCond %{QUERY_STRING} {[^a-zA-Z0-9]([a-zA-Z]+)[^a-zA-Z0-9]
RewriteRule ^(.*)? $1?method=sendJson&json={%22%1%22:%22%2%22,%22%3%22:%22%4%22} [R,L,NE]
參考
https://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html(官網各配置項說明)