您好,登錄后才能下訂單哦!
場景
最近在工作中遇到一個需求,有個頁面 a.vm,對 ajax 請求的結果進行判斷后,獲取結果里面的數據傳遞給一個 URL(b.htm),跳轉到新的頁面 b.htm。
遇到的問題
因為一開始是 GET 請求,所以當傳遞的數據過大的時候,會報錯 nginx 414 request-uri too long
客戶端請求頭緩沖區大小,如果請求頭總長度大于小于128k,則使用此緩沖區
client_header_buffer_size 128k;
請求頭總長度大于128k時使用 large_client_header_buffers
設置的緩存區
large_client_header_buffers
指令參數4為個數,128k為大小,默認是8k。申請4個128k。
large_client_header_buffers 4 128k;
當http 的URI太長或者request header
過大時會報414 Request URI too large
或400 bad request
錯誤
造成這樣的原因
cookie中寫入的值太大造成的,因為header中的其他參數的size一般比較固定,只有cookie可能被寫入較大的數據
請求參數太長,比如發布一個文章正文,用urlencode后,使用get方式傳到后臺
本次的故障原因是由問題 2 引起的。即當請求頭過大時,超過 large_client_header_buffer
時,nginx可能返回 Request URI too large (414)
或者 Bad-request(400)
錯誤。
當Request line的長度大于large_client_header_buffer
的一個buffer(128k)
時,nginx會返回"Request URI too large" (414)
錯誤,對應上面的場景2。
請求頭中最長的一行也要小于large_client_header_buffer
,當不是Request line的最長行大于一個buffer(128k)時,會返回"Bad-request"(400)
錯誤,對應上面的場景1。
臨時解決辦法
修改 nginx 參數
主要是調大以下參數值:
client_header_buffer_size 512k; large_client_header_buffers 4 512k;
但是調大這個值會出現一個問題,當我的服務器騰挪數據量比較大的時候,可能又要修改這樣不是一個辦法,最終的解決辦法就是由 GET 請求方式修改為 POST 請求方式
最終解決辦法
使用 jquery.redirect.js 框架來處理這樣的情況,主要使用到的函數是 $.redirect
代碼如下:
$http({ method: "POST", dataType: "json", contentType: 'application/json', url: url, data: data, }).success(function (data) { if (data.success) { crId = data.data; $scope.errMsg = ""; var url = "/xx.htm?id=" + id; window.location.href = url } else { $scope.errMsg = data.message; $scope.isDisabled = false; $scope.errorCode = data.code; $scope.trv.physics = data.data; if(data.statusCode === -224){ var vms = data.data; console.log("vms: " + vms); $.redirect('/b.htm', {'vms': vms.toString(), 'resource': trv.resource, 'errMsg': $scope.errMsg}); } } }).error(function (data) { alert(data); $scope.isDisabled = false; });
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。