1. 程式人生 > >IE的URL的最大長度限制和如何解決URL最大長度的限制

IE的URL的最大長度限制和如何解決URL最大長度的限制

 做Web開發時經常涉及到頁面之間的轉跳,頁面之間的轉跳就會涉及到頁面之間引數的傳遞,通過URL傳遞引數是常用的方法之一,但是微軟說:"Maximum URL length is 2,083 characters in Internet Explorer",也就是說URL是有長度限制的。

1.    Get方法長度限制

Http Get方法提交的資料大小長度並沒有限制,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。

如:IE對URL長度的限制是2083位元組(2K+35)。

下面就是對各種瀏覽器和伺服器的最大處理能力做一些說明.

Microsoft Internet Explorer (Browser)

IE瀏覽器對URL的最大限制為2083個字元,如果超過這個數字,提交按鈕沒有任何反應。
Firefox (Browser)

對於Firefox瀏覽器URL的長度限制為65,536個字元。

Safari (Browser)

URL最大長度限制為 80,000個字元。

Opera (Browser)

URL最大長度限制為190,000個字元。

Google (chrome)

URL最大長度限制為8182個字元。

Apache (Server)

能接受最大url長度為8,192個字元。

Microsoft Internet Information Server(IIS)

能接受最大url的長度為16,384個字元。

通過上面的資料可知,為了讓所有的使用者都能正常瀏覽, URL最好不要超過IE的最大長度限制(2083個字元),當然,如果URL不直接提供給使用者,而是提供給程式呼叫,這時的長度就只受Web伺服器影響了。

注:對於中文的傳遞,最終會為urlencode後的編碼形式進行傳遞,如果瀏覽器的編碼為UTF8的話,一個漢字最終編碼後的字元長度為9個字元。

因此如果使用的 GET 方法,最大長度等於URL最大長度減去實際路徑中的字元數。

2.    POST方法長度限制

理論上講,POST是沒有大小限制的。HTTP協議規範也沒有進行大小限制,起限制作用的是伺服器的處理程式的處理能力。

如:在Tomcat下取消POST大小的限制(Tomcat預設2M);

開啟tomcat目錄下的conf目錄,開啟server.xml 檔案,修改

<Connector

debug="0"

acceptCount="100"

connectionTimeout="20000"

disableUploadTimeout="true"

port="8080"

redirectPort="8443"

enableLookups="false"

minSpareThreads="25"

maxSpareThreads="75"

maxThreads="150"

maxPostSize="0"

URIEncoding="GBK"

</Connector>

增加紅色字型部分 maxPostSize="0" (設為0是取消POST的大小限制)



    ASP.NET應用程式前臺與後臺的資料交換都是通過FORM表單來完成的,FORM表單提供了兩種資料傳輸方式:GET和POST,這個兩種資料傳輸方式在實際傳輸中有很大的不同,但ASP.NET框架中已經遮蔽了二者的一些差異。GET是用來從伺服器上獲得資料,而POST是用來向伺服器提交資料的。二者資料傳輸過程中分別對應了HTTP協議中的GET和POST方法。

    GET方式是把引數資料佇列加到提交表單的ACTION屬性所指的URL後面,並且使用"?"隔開,值和表單內各個欄位一一對應,在URL中可以看到,它是FROM預設的提交方式,受URL長度的限制,它所能傳遞的資料量小。
    POST方式是把表單中的資料放在FORM載體中,按照變數和值相對應的方式,傳遞到ACTION所指向URL,POST可以傳遞大資料量的資訊到伺服器,通常檔案上傳就是使用POST方式上傳。

    為解決GET方式傳遞大資料量引數的問題,要使用POST方式進行資料提交,下面是一個用來代替window.open的方法
1.JavaScript
/*
 * PostNewWin
 * Author:ppchen
 
*/
var PostNewWin = function(url){
    var urlArr = url.split("?");
    var postUrl = urlArr[0];
    var postData = urlArr[1];
    var iframe = document.getElementById("postData_iframe");
    if(!iframe){
        iframe = document.createElement("iframe");
        iframe.id = "postData_iframe";
        iframe.scr= "about:blank";
        iframe.frameborder = "0";
        iframe.style.width = "0px";
        iframe.style.height = "0px";
        
        var form = document.createElement("form");
        form.id = "postData_form";
        form.method = "post";
        form.target = "_blank";
        
        document.body.appendChild(iframe);
        iframe.contentWindow.document.write("<body>" + form.outerHTML + "</body>");
    }
    iframe.contentWindow.document.getElementById("postData_form").innerHTML = "<input name='postData' id='postData' type='text' value='" + postData + "'/>";
    iframe.contentWindow.document.getElementById("postData_form").action = postUrl;
    iframe.contentWindow.document.getElementById("postData_form").submit();
};  
2.CSharp
///<summary>/// 從Form中取得引數
/// Author:ppchen
///</summary>///<returns>引數集合</returns>private NameValueCollection ParseFormData()
{
    NameValueCollection sQueryString = new NameValueCollection();
    if (this.Request.Form.Count > 0 && this.Request.Form["postData"] != null)
    {
        string sPostData = this.Request.Form["postData"].ToString();
        sPostData = sPostData.Trim(new char[] { '&''' });
        if (!string.IsNullOrEmpty(sPostData))
        {
            string[] sParameterList = sPostData.Split('&');
            for (int i = 0; i < sParameterList.Length; i++)
            {
                string[] sParameter = sParameterList[i].Split('=');
                for (int j = 0; j < sParameter.Length; j = j + 2)
                {
                    sQueryString.Add(sParameter[j], HttpUtility.UrlDecode(sParameter[j + 1]));
                }
            }
        }
    }
    return sQueryString;
}
通過以上的JS程式碼在客戶端開啟頁面,通過以上的CS程式碼在服務端取得引數,這樣使用了POST方式解決了GET方式中URL的長度限制,可以傳遞大資料量的引數了:)