HTTP中的URL长度限制
轉(zhuǎn)自:https://blog.csdn.net/cscrazybing/article/details/53895289??
?
由于之前的一個(gè)web項(xiàng)目中,要用get方法去獲取數(shù)據(jù),但結(jié)果時(shí)常報(bào)錯(cuò),經(jīng)過(guò)仔細(xì)排查才發(fā)現(xiàn)原來(lái)url長(zhǎng)度超過(guò)了限制,通過(guò)縮短url和發(fā)送多次請(qǐng)求的方法解決了該問(wèn)題,之后在網(wǎng)上查了些資料,發(fā)現(xiàn)這個(gè)問(wèn)題還是內(nèi)藏玄機(jī),要比自己想的復(fù)雜。
? ? ? ?首先,其實(shí)http 1.1 協(xié)議中對(duì)url的長(zhǎng)度是不受限制的,協(xié)議原文:
? ? ? ?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協(xié)議不對(duì)URI的長(zhǎng)度作事先的限制,服務(wù)器必須能夠處理任何他們提供資源的URI,并且應(yīng)該能夠處理無(wú)限長(zhǎng)度的URIs,這種無(wú)效長(zhǎng)度的URL可能會(huì)在客戶端以基于GET方式的請(qǐng)求時(shí)產(chǎn)生。如果服務(wù)器不能處理太長(zhǎng)的URI的時(shí)候,服務(wù)器應(yīng)該返回414狀態(tài)碼(此狀態(tài)碼代表Request-URI太長(zhǎng))。
? ? 注:服務(wù)器在依賴大于255字節(jié)的URI時(shí)應(yīng)謹(jǐn)慎,因?yàn)橐恍┡f的客戶或代理實(shí)現(xiàn)可能不支持這些長(zhǎng)度。
? ? 具體參見(jiàn)協(xié)議?中的3.2.1
? ?
? ? ?雖然協(xié)議中未明確對(duì)url進(jìn)行長(zhǎng)度限制,但在真正實(shí)現(xiàn)中,url的長(zhǎng)度還是受到限制的,一是服務(wù)器端的限制,二就是游覽器端的限制。
? ? ?一、服務(wù)器端
? ? ?在服務(wù)器端,主要是apache,jboss和nginx等,我在網(wǎng)上找到的調(diào)節(jié)方法可以參加下文:關(guān)于http請(qǐng)求url長(zhǎng)度以及請(qǐng)求消息體長(zhǎng)度的研究(一)(服務(wù)器端)
? ? 1.1 nginx?
? ? 由于現(xiàn)在項(xiàng)目中主要用到nginx,所以強(qiáng)調(diào)下它的設(shè)置參數(shù):large_client_header_buffers
? ? 該參數(shù)對(duì)nginx服務(wù)器接受客戶端請(qǐng)求的頭信息時(shí)所分配的最大緩沖區(qū)的大小做了限制,也就是nginx服務(wù)器一次接受一個(gè)客戶端請(qǐng)求可就收的最大頭信息大小。這個(gè)頭不僅包含 request-line,還包括通用信息頭、請(qǐng)求頭域、響應(yīng)頭域的長(zhǎng)度總和。這也相當(dāng)程度的限制了url的長(zhǎng)度。
? ? ?nginx服務(wù)器默認(rèn)的限制是4K或者8K,這是根據(jù)服務(wù)器的硬件配置有關(guān)的,一般為內(nèi)存一頁(yè)的大小,目前大部分為4K,即4096字節(jié)。
? ? ?
? ? 1.2 nodejs
? ? ?這主要是針對(duì)nodejs程序員,如不做相關(guān)開(kāi)發(fā)可以直接忽略這一節(jié)。
? ? ?nodejs的http服務(wù),設(shè)置url長(zhǎng)度限制和headers的大小還是相對(duì)比較靈活的,我簡(jiǎn)單實(shí)現(xiàn)了控制程序,這里_limit就是url長(zhǎng)度的控制器
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中有實(shí)現(xiàn)相類似功能的模塊,
? ? ?
?
? ? ?二、游覽器端
? ? ?游覽器的種類繁多,并且對(duì)URL的長(zhǎng)度限制是有所差異的,具體如下:
| 游覽器 | 最大長(zhǎng)度(字符數(shù)) ? ? ? ? ? | 備注 |
| ?Internet Explorer ? | 2083 ? ?? | 如果超過(guò)這個(gè)數(shù)字,提交按鈕沒(méi)有任何反應(yīng) |
| ?Firefox | 65,536 | ? |
| ?chrome | 8182 | ? |
| ?Safari? | 80,000 | ? |
| ?Opera | 190,000 | ? |
| curl(linux下指令) | 8167 | ? |
? ??
?
?
?
?
這些數(shù)據(jù)主要通過(guò)網(wǎng)上數(shù)據(jù)搜索而來(lái),筆者還沒(méi)有親自驗(yàn)證過(guò)。但都有限制是不爭(zhēng)的事實(shí),大家在做開(kāi)發(fā)時(shí)要特別注意。
總結(jié)
以上是生活随笔為你收集整理的HTTP中的URL长度限制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vim中字符串的替换
- 下一篇: python统计代码行数_使用Pytho