URL中可以正确使用多个片段标识符吗?

9

我偶然发现一个网站在其URL中使用了多个片段标识符,例如http://www.ejeby.se/#newprodukt#produkt#1075#1(不是我的网站,但我链接到了它,这给我带来了麻烦)。

但这真的正确吗?这似乎会导致Safari和可能也包括Internet Explorer的问题(传言如此,我自己没有尝试过IE)。

片段标识符难道不应该唯一地标识文档中的一个位置吗? 这是Safari的错误还是www.ejeby.se错误地使用了片段标识符?

编辑:看起来Safari的问题在于它会转义URL中除第一个以外的所有#。其他浏览器不会这样做。这是正确的行为吗?

1个回答

12

从规范的角度来看,片段可以包含以下字符(我已经展开了它们的定义):

fragment    = *( ALPHA / DIGIT / "-" / "." / "_" / "~" / "%" HEXDIG HEXDIG / "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" / ":" / "@" / "/" / "?" )

所以,不,片段中不能包含普通的#;它必须用%23进行编码。

但是有可能某些浏览器将其显示为百分号编码的八位字节序列,这些序列表示有效的UTF-8字符,被替换为它们所代表的字符。


我认为这不仅仅是显示方式不同,因为在Chrome中http://www.ejeby.se/#newprodukt#produkt#1075#1可以导航到正确的页面,但是在Safari中http://www.ejeby.se/#newprodukt%23produkt%231075%231会导致搜索结果错误(倒数第二个#被转义为%23)。 - Johan
@Johan:你用的是哪个Safari版本?因为对我来说可以正常工作(在Mac上使用的是Safari 5),前者中的#会自动转换为后者中的%23 - Gumbo
很奇怪。我在Snow Leopard上使用Safari 5.0.3,但在Safari中两者都无法工作(因为它会转义字符,导致页面没有搜索结果)。第一个在Chrome / Firefox / Opera中可以工作。 - Johan
我现在注意到链接是“javascript:;”,并且URL是使用JavaScript设置的,如下所示:window.location.hash="newprodukt#"+name+"#"+id+"#"+page"。奇怪的是,当使用JavaScript设置(仍然转义)URL时,它确实可以工作,但是当它是<a>元素上的常规href属性时却不能正常工作。他们设法实现了从另一个站点链接时在Safari中断开链接的情况?:( - Johan
1
忘记将其标记为已接受。它确实回答了原始问题(带有“不,它不正确”的答案)。哪个浏览器对魔法转义等做什么可能是另一个问题。 - Johan

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