由於之前的一個web項目中,要用get方法去獲取數據,但結果時常報錯,經過仔細排查才發現原來url長度超過了限制,通過縮短url和發送多次請求的方法解決了該問題,之后在網上查了些資料,發現這個問題還是內藏玄機,要比自己想的復雜。
首先,其實http 1.1 協議中對url的長度是不受限制的,協議原文:
The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).
Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxyimplementations might not properly support these lengths.
翻譯:
HTTP協議不對URI的長度作事先的限制,服務器必須能夠處理任何他們提供資源的URI,並且應該能夠處理無限長度的URIs,這種無效長度的URL可能會在客戶端以基於GET方式的請求時產生。如果服務器不能處理太長的URI的時候,服務器應該返回414狀態碼(此狀態碼代表Request-URI太長)。
注:服務器在依賴大於255字節的URI時應謹慎,因為一些舊的客戶或代理實現可能不支持這些長度。
具體參見協議 中的3.2.1
雖然協議中未明確對url進行長度限制,但在真正實現中,url的長度還是受到限制的,一是服務器端的限制,二就是游覽器端的限制。
一、服務器端
在服務器端,主要是apache,jboss和nginx等,我在網上找到的調節方法可以參加下文:關於http請求url長度以及請求消息體長度的研究(一)(服務器端)
1.1 nginx
由於現在項目中主要用到nginx,所以強調下它的設置參數:large_client_header_buffers
該參數對nginx服務器接受客戶端請求的頭信息時所分配的最大緩沖區的大小做了限制,也就是nginx服務器一次接受一個客戶端請求可就收的最大頭信息大小。這個頭不僅包含 request-line,還包括通用信息頭、請求頭域、響應頭域的長度總和。這也相當程度的限制了url的長度。
nginx服務器默認的限制是4K或者8K,這是根據服務器的硬件配置有關的,一般為內存一頁的大小,目前大部分為4K,即4096字節。
1.2 nodejs
這主要是針對nodejs程序員,如不做相關開發可以直接忽略這一節。
nodejs的http服務,設置url長度限制和headers的大小還是相對比較靈活的,我簡單實現了控制程序,這里_limit就是url長度的控制器
var http = require('http');
var _limit = 40;
var app = http.createServer(function(req,res){
console.log('hello world');
var potocol = 'http:\/\/';
var host = req.headers.host;
var url = req.url;
var code = 200;
var allurl = potocol + host + url;
console.log(allurl);
var len = allurl.length;
if(len > _limit){
var code = 414;
res.writeHead(code, {});
res.end();
}
else{
var body = {'name':'jifeng'};
res.writeHead(code, {});
res.end(JSON.stringify(body));
}
});
app.listen(1987,function(){
console.log('server listen on 1987');
});
備注: connect中的limit中有實現相類似功能的模塊,
二、游覽器端
游覽器的種類繁多,並且對URL的長度限制是有所差異的,具體如下:
游覽器 | 最大長度(字符數) | 備注 |
Internet Explorer | 2083 | 如果超過這個數字,提交按鈕沒有任何反應 |
Firefox | 65,536 | |
chrome | 8182 | |
Safari | 80,000 | |
Opera | 190,000 | |
curl(linux下指令) | 8167 |
這些數據主要通過網上數據搜索而來,筆者還沒有親自驗證過。但都有限制是不爭的事實,大家在做開發時要特別注意。