解決:Invalid character found in the request target.The valid characters are defined in RFC 7230 and RF

背景

在將tomcat升級到7.0.81版後,發現系統的有些功能不能使用了,查詢日誌發現是有些地址直接被tomcat認爲存在不合法字符,返回HTTP 400錯誤響應,錯入信息以下:
apache

緣由分析

經瞭解,這個問題是高版本tomcat中的新特性:就是嚴格按照 RFC 3986規範進行訪問解析,而 RFC 3986規範定義了Url中只容許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及全部保留字符(RFC3986中指定了如下字符爲保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而咱們的系統在經過地址傳參時,在url中傳了一段json,傳入的參數中有"{"不在RFC3986中的保留字段中,因此會報這個錯。json

根據(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=|{},表示把{}放行tomcat

------2018.01.30 新增--------
按照上面的方法處理好後,在非IE瀏覽器上訪問,是沒有問題了。但如果在IE瀏覽器上進行訪問,這個錯誤仍是會出現,在IE上訪問出現這個錯誤的緣由:由於url的參數json中有雙引號,火狐和谷歌瀏覽器會自動對url進行轉碼,但IE不會服務器

這種狀況的處理方法:
給系統配置方向代理服務器,經過反向代理服務器進行urlrewrite,手動取出各個json的數據,手動將雙引號進行轉碼爲%22:url

具體方式以下:
編輯 Apache安裝目錄/conf/httpd.conf, 在配置項目反向代理的前面添加以下信息:代理

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]:[^a-zA-Z0-9]([a-zA-Z0-9*]+)[^a-zA-Z0-9],[^a-zA-Z0-9]([a-zA-Z]+)[^a-zA-Z0-9]:[^a-zA-Z0-9]([a-zA-Z0-9*]+)[^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(官網各配置項說明)htm

相關文章
相關標籤/搜索