13

我想使用location.hash对我的客户端应用程序的状态进行编码,以便用户可以使用 URL 轻松地为应用程序添加书签和/或共享应用程序的完整状态。

关于 url 的最大长度有许多(过时的)主题,尤其是 Internet Explorer 中的限制。然而,目前尚不清楚最大尺寸是多少location.hash。因为散列只存在于客户端,所以不受 http 或服务器的限制。

我做了一个简单的 jsfiddle 来测试这个:http: //jsfiddle.net/Jz3ZA/。在 Chrome 和 Firefox (Ubuntu 12.04) 中,高达 50K 的哈希值似乎都有效。这是否意味着我可以使用它们来存储状态,或者我是否忽略了其他限制?

4

3 回答 3

11

基于您的 JS Fiddle(以及它的修改版本http://jsfiddle.net/Jz3ZA/18/(参见下面的代码示例)),您可以测试大量浏览器以获得有效的基线。

  • 铬:50K+
  • 火狐:50K+
  • Safari (iOS):50K+
  • Internet Explorer 11:在 2,025 到 2,050 之间失败
  • Microsoft Edge:在 2,025 和 2,050 之间失败

因此,无论其他浏览器支持什么,如果您需要支持 Microsoft Edge 或 IE11,那么您需要保持在 2,025 个字符哈希以下。由于 IE(因此我猜是 Edge)历来都有 URL 长度限制……这也可能取决于您的基本 URL 的长度。

function testall(){
  var sizes = [10,100,1000,2000,2025,2050,2100,2250,2500,2750,3000,4000,5000,10000, 50000];
  for(var i=0;i<sizes.length;i++){
    var n = sizes[i];
    if(!testhash(n)){
        alert("test failed at hash of length: " + n);
        return;
    }
  }
  alert("all tests passed");  
}

function testhash(n){
    var somestring = "#" + makestring(n);
    window.location.hash = somestring; 
    var success = (window.location.hash == somestring); 
    return success
}    

function makestring(n){
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for(var i=0;i<n;i++){
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
}
$("button").on("click", testall);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<button>Test!</button>

于 2017-06-13T22:44:30.060 回答
-3

这种误导性的解释。Hash 没有大小限制,您可以随意使用它。请记住,它不是 url 部分。

于 2014-09-27T00:01:26.540 回答
-5

What is the maximum length of a URL in different browsers?

This typically does not include the hash part though, so I don't think there's a standard.

I would like to point out that the fragment identifier is typically used to identify a fragment of a document, and shouldn't be used to store the entire state of an app. You should use localstorage instead.

If you would like the ability to share or bookmark, consider storing the app's state on the server-side, and use the fragment identifier to store the id of the stored state.

于 2013-04-27T01:35:40.290 回答