如果URL在片段部分中有异常字符(即在#之后),它们应该如何(百分比)转义?我无法在浏览器如何处理这个问题时找到一致的答案,这可能是没有它们的好理由,但我想知道“正确”的答案是什么.
我的测试似乎建议不要逃避,但这只在跟踪链接时是可靠的,而不是在粘贴到浏览器的地址栏时.
我写了一个附加的小网页.然后我将以下链接粘贴到各种浏览器中.页面中的“go”链接可以查看单击链接时发生的情况,而不是粘贴链接(在某些浏览器中似乎有所不同)
http://www.frankieandshadow.com/test.html/?new=1# {#&} {#&}
(我注意到stackoverlow的URL模式匹配不喜欢 – 我打算整行;再次可能在那里有线索!)
Chrome似乎不会出现任何类型的错误,并且始终如一地产生:
#{#&} {#&}
Firefox替换了一些(但不是全部)使用非转义等价物粘贴的转义字符,然后生成
#{#&} {#&}
如果你按照链接这是一样的
Safari(在PC上)则相反:它在粘贴上编码非编码的异常字符,然后生成
#{#&} {#&}
但是跟随链接是不同的,生产
#{#&} {#&}
令人惊讶的是,IE9的行为就像Chrome一样
IE7用on paste替换了真实空间,但是否则单独留下了URL,并产生了
#{#&} {#&}
如果你点击链接,它会给出
#{#&} {#&}
<html> <head> <title>test</title> <script type="text/javascript"> function wibble() { document.getElementById("wobble").innerHTML = location.hash.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"); } </script> </head> <body onload='wibble()'> <div id='wobble'></div> <a href='/test.html?new=1#{# &}%7B%23%20%26%7D'>go</a> </body> </html>
解决方法
RFC3986中的ABNF表示片段由pchars组成 – 即它们是百分比编码的.
也就是说,片段标识符中的字符可以是任何字母数字或其中之一
-._〜!$&'()*,; =:@
所有其他字符应为百分比编码.