nginx+tomcat報400的坑

  nginx+tomcat的網頁,在手機上經過瀏覽器能夠正常訪問,可是在本身的app的webview中訪問就報400。查了訪問日誌,每次app中訪問該頁面,tomcat中就出現一個GET null的申請,但不知道怎麼來的,真是百思不得其解。html

  直到在網上找到這個:《記一次nginx+tomcat8請求400錯誤的坑》,這個跟個人問題應該是如出一轍。核心緣由就是申請中包含了特殊字符|{}或者空host參數。估摸着瀏覽器對這種字符進行了轉碼,而app的webview控件處理過於簡單,而後被tomcat拒絕了。java

  記錄下,備用。nginx

  1. request header過大所引發,request過大,一般是因爲cookie中寫入了較大的值所引發。 在nginx.conf中,將client_header_buffer_sizelarge_client_header_buffers都調大,可緩解此問題。
  2. 客戶端的調用方式沒有使用host 參數,傳遞了空的Host頭給服務端,一旦Nginx設置了proxy_set_header Host $host,空Host頭就傳給了後端。然而,在http 1.1的規範中,Host只要出現空,就會返回400,因此出現了這個故障。而對於須要在Host字段裏帶上端口信息的,則仍須要配置proxy_set_header Host $host:$server_port
  3. 在server下加入server_name _;
  4. 在tomcat的server.xml中加入如下配置:
    <Valve className="org.apache.catalina.valves.RemoteIpValve"
                      portHeader="x-forwarded-port"
                      remoteIpHeader="x-forwarded-for"
                      proxiesHeader="x-forwarded-by"
                      protocolHeader="x-forwarded-proto" />
  5. 配置tomcat支持|{}等字符的方法是:在 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

相關文章
相關標籤/搜索