【问题标题】:Multiple hash signs in URLURL 中有多个哈希符号
【发布时间】:2012-06-06 17:23:11
【问题描述】:

或者也许你称它为“尖锐”——# 符号。

我遇到过一个实例,其中 #!和 # 在单个 URL 中同时使用。通过阅读包括 RFC 在内的其他文章,我无法理解这是否是合法的组合。当遇到这样的页面 Mozilla 浏览器(在这种情况下为 Iceweasel)显示 URL 有 2 个 #,而 Chrome 只显示一个,但很快就死掉了(包含该页面的选项卡变得无响应并崩溃 - 但它可能没有连接) .

现在,我的问题是,在一个 URL 中同时包含两者是否合法,是否可能合法且多余(应该规范化),还是只是 Mozilla 浏览器中的一个错误?那么,假设我正在发出 AJAX 请求,或者尝试浏览浏览器历史记录 - 如果遇到这种情况,我该怎么办?

RFC-3986: https://www.rfc-editor.org/rfc/rfc3986#section-3.4 ,应该澄清它...以防万一。

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

【问题讨论】:

  • ^-- 标记为重复,而不是将人们引导到另一个问题,因为这里的答案没有给出允许的字符和基本原理的具体列表,而是发送一个寻找 pchar 的内容是。

标签: javascript http url seo


【解决方案1】:

片段的格式只允许使用斜杠、问号和pchars。如果您查看 RFC,您会发现井号不是有效的 pchar

但是,浏览器会尽最大努力通过将重复哈希视为已转义来读取无效 URL,您可以通过检查 window.location.hash(在 IE、Firefox 和 Chrome 中)的值来查看

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

window.location.hash 相同

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

【讨论】:

【解决方案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'由一系列由斜杠分隔的路径段组成 (“/“) 特点。'路径段又只能由 pchars 组成,参见例如this answer。所以这里没有哈希!它还将以“第一个问号 ("?") 或数字符号 ("#") 或 URI 结尾来终止。
  • query 部分(由第一个“?”表示)只能由 pchar、“/”或“?”组成并将“以数字符号 ("#") 字符或 URI 结尾结尾。”

所以,到目前为止,除了终止 URI 之外,不允许使用任何散列,如果想使用至少一个散列,这不是我们想要的;-)

最后:

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

总结一下: 在兼容的 URL(或 URI)中只允许使用一个“#”作为 URL 片段的标记。 特别是应该在路径中的哈希符号(至少从外观上看,因为后面有斜线)是有问题的,因为它们正式终止了路径部分。

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

【讨论】:

    【解决方案3】:

    正如@apsillers 所说,这可能是合法的。但除非必要,否则我会避免使用它,因为它可能会导致有关 url 的某些混乱。

    那种网址:

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

    对我来说似乎真的很困惑,对普通用户甚至搜索引擎来说会更加困惑。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2017-01-16
      • 2017-04-24
      • 2023-03-29
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多