浏览器中location.hash的最大大小

18

我想使用 location.hash 来编码客户端应用程序的状态,以便用户可以轻松地使用 URL 收藏和/或分享完整状态的应用程序。

有许多关于 URL 最大长度的(过时)主题,特别是在 Internet Explorer 中的限制。但是,location.hash 的最大大小并不清楚。由于哈希只存在于客户端中,因此 HTTP 或服务器的限制无关紧要。

我创建了一个简单的 jsfiddle 来测试这个问题:http://jsfiddle.net/Jz3ZA/。在 Chrome 和 Firefox(Ubuntu 12.04)中,50K 的哈希似乎可以工作。这是否意味着我可以使用它们来存储状态,还是我忽略了其他限制?


2
URL的大小限制没有标准,因此哈希理论上可以是任何长度,但是您不能信任特定浏览器会做什么(尤其是IE)。 - Explosion Pills
为什么不将状态存储在服务器上? - Blender
我在Internet Explorer 11上运行了你的fiddle,但在哈希长度为3000时失败了。 - Cristian Necula
3个回答

14

基于你的 JS Fiddle(稍作修改版请参见下方代码样例:http://jsfiddle.net/Jz3ZA/18/),你可以测试很多浏览器以获得有效的基线。

  • Chrome:50K+
  • Firefox: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>


火狐浏览器现在似乎支持1M,Chromium在40M时崩溃了。由于IE和旧版非blink Edge正在变得不重要,实际限制可能已经提高了。不过,我没有测试Safari和移动浏览器。 - Maciej Krawczyk
1
同意,但强调正在变得不重要...我们中的一些人仍然需要支持IE... :-( - scunliffe

-6

这是一个误导性的解释。哈希表没有大小限制,您可以随意使用它。只需记住它不是 URL 的一部分。


3
我不认为这是真的。维基百科说:“由井号#引入的片段标识符是文档URL的可选最后一部分。” - Jeroen Ooms

-7

不同浏览器中URL的最大长度是多少?

通常这不包括哈希部分,因此我认为没有标准。

我想指出的是,片段标识符通常用于标识文档的片段,不应该用于存储应用程序的整个状态。您应该使用localstorage

如果您想要分享或书签的功能,请考虑将应用程序的状态存储在服务器端,并使用片段标识符来存储存储状态的ID。


3
问题明确是关于哈希部分的,因此这并没有回答这个问题。 - Jeroen Ooms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接