URL中有多个哈希标志

时间:2012-06-01 12:59:41

标签: javascript http url seo

或许你称它为“尖锐” - #符号。

我遇到过一个实例,#!和#在一个URL中同时使用。从阅读其他文章,包括RFC,我无法理解这是否是合法的组合。当遇到这样的页面时,Mozilla浏览器(在本例中为Iceweasel)将URL显示为2#,而Chrome只显示一个,但不久之后就会死亡(包含该页面的选项卡变得无响应并崩溃 - 但可能没有连接)

现在,我的问题是,在一个URL中同时使用它们是合法的还是冗余的(应该规范化),还是仅仅是Mozilla浏览器中的错误?所以,假设我正在制作一个AJAX请求,或试图浏览浏览器历史记录 - 如果我遇到这种情况,该怎么办?

double hash in url

RFC-3986:http://tools.ietf.org/html/rfc3986#section-3.4,应该澄清它......以防万一。

另外:https://developers.google.com/webmasters/ajax-crawling/docs/specification Google抓取工具如何查看内容。

3 个答案:

答案 0 :(得分:13)

片段的格式只允许使用斜杠,问号和pchar。如果您查找RFC,您会看到哈希标记不是有效的pchar

但是,浏览器会尽量通过处理重复哈希来读取无效的网址,就像它们被转义一样,您可以通过检查window.location.hash(在IE,Firefox和Chrome中)的值来查看

http://www.example.com/hey#foo#bar

window.location.hash相同
http://www.example.com/hey#foo%23bar

答案 1 :(得分:2)

@apsillers提到它可能是合法的。但除非必要,否则我会避免使用它,因为它可能会对网址造成一定的混淆。

那种网址:

http://www.example.com/hey#foo#bar

似乎让我感到困惑,对普通用户和搜索引擎来说会更加混乱。

答案 2 :(得分:2)

至少在提到RFC 3986时,我的回答是明确的。 但是您不仅需要查看3.4

Section 3定义URI的结构如下:

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment

(我只是上半部分,与URL有关)

因此,要回答您的问题,您必须查看所有部分:

  • scheme不能包含哈希符号(仅ALPHA *( ALPHA / DIGIT / "+" / "-" / "."
  • autority可能不包含哈希(在此不做详细介绍),甚至可能由下一个斜杠(“ /”),问号(“?”)或数字符号终止(“#”)'。
  • path'包含由斜杠分隔的一系列路径段 (“ /”)字符。”路径段又只能由pchar组成,例如this answer。所以这里没有哈希!还会以“第一个问号(“?”)或数字符号(“#”)或URI的结尾”结尾。
  • query部分(由第一个“?”表示)只能由pchar,“ /”或“?”组成并且将“以数字符号(“#”)字符或URI的结尾终止。”

因此,到目前为止,除了要终止URI(如果要使用至少一个散列;-)

以外,就不允许使用散列;

最后:

  • fragment“由存在数字符号(“#”)表示”,并且仅由pchar,“ /”或“?”组成。它“在URI末尾终止”。

总结一下: 兼容的URL(或URI)中仅允许一个“#”作为URL片段的标记。 尤其是应该在路径中的哈希符号(至少从外观来看,因为后面会有斜线)在正式终止路径部分时会出现问题。

这可能会导致问题,例如在使用此功能的单页应用程序中,因为散列后的导航是在客户端而不是在服务器上完成的。在这种情况下,SPA应该确保在接收时正确处理了其余URL,其中可能包括(特定于浏览器的)URL编码的查询和片段。