【问题标题】:URI starting with two slashes ... how do they behave?URI 以两个斜杠开头……它们的行为如何?
【发布时间】:2011-05-03 12:51:45
【问题描述】:

最近我看到工作这样的代码块:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

根据 RFC 2396(URI 语法)和 RFC 2616(HTTP 1.1),这些以两个斜杠开头的 URI 是有效的,但遗憾的是 RFC 并没有真正解释它们。

谁能给我指出一个解释浏览器将/应该/确实处理这些 URI 的资源?

【问题讨论】:

    标签: html http uri protocol-relative


    【解决方案1】:

    您要查找的资源是RFC 3986。

    请参阅第 4.2 节和第 5.4 节。引用后者:

    参考解析示例

    在具有明确定义的基本 URI 的表示中:

        http://a/b/c/d;p?q
    

    一个相对引用被转换成它的目标 URI,如下所示:

      "g:h"           =  "g:h"
      "g"             =  "http://a/b/c/g"
      "./g"           =  "http://a/b/c/g"
      "g/"            =  "http://a/b/c/g/"
      "/g"            =  "http://a/g"
      "//g"           =  "http://g"
      "?y"            =  "http://a/b/c/d;p?y"
      "g?y"           =  "http://a/b/c/g?y"
      "#s"            =  "http://a/b/c/d;p?q#s"
      "g#s"           =  "http://a/b/c/g#s"
      "g?y#s"         =  "http://a/b/c/g?y#s"
      ";x"            =  "http://a/b/c/;x"
      "g;x"           =  "http://a/b/c/g;x"
      "g;x?y#s"       =  "http://a/b/c/g;x?y#s"
      ""              =  "http://a/b/c/d;p?q"
      "."             =  "http://a/b/c/"
      "./"            =  "http://a/b/c/"
      ".."            =  "http://a/b/"
      "../"           =  "http://a/b/"
      "../g"          =  "http://a/b/g"
      "../.."         =  "http://a/"
      "../../"        =  "http://a/"
      "../../g"       =  "http://a/g"
    

    这意味着当基本 URI 为 http://a/b/c/d;p?q 并且您使用 //g 时,相对引用将转换为 http://g。

    【讨论】:

    • 所以这可以成为使用 javascript 来确定 http 或 https 的解决方案吗?
    • 由于需要达到父级,所以使用../g——它将使用当前协议并导致http://a/b/c/g。
    • 这可能是一个新手问题,但是这个基础 URI 是从哪里来的呢?浏览器网址栏?服务器? html页面中的标签?
    • @thenaglecode:答案是,这取决于。在 XML/XHTML/HTML5 中,您可以使用 xml:base 到 set it explicitly on any element。默认情况下,在 HTML 中,基本 URI 与页面的 URI 相同(但在 CSS 文件中,基本 URI 是 relative to the CSS uri, not the containing HTML,但较旧的 IE 使其相对于 HTML)。在其他协议和语言中,它可能有所不同(例如,在 XSLT 中,它取决于当前项)。另见&lt;html:base&gt;。
    • 重要 - 结果并不总是http!这取决于页面上下文的协议。如果上下文是在http://a/b/c/d;p?q 下加载的,那么//g 确实会解析为http://g。但是如果页面加载为http://a/b/c/d;p?q,那么结果将是https://g。并且不要忘记其他协议,例如file://(页面从磁盘加载)——这肯定会让你很头疼。
    【解决方案2】:

    这些是protocol relative URLs.,它们指向一个地址,保持当前协议。

    此表示法通常用于避免“混合内容”问题(一条 IE 警告消息,抱怨同一 HTTPS 页面上的 http 和 https 资源)。

    更新:官方文档 in RFC 3986:

    以两个斜线字符开头的相对引用称为 网络路径参考;这种引用很少使用。一种 以单个斜杠字符开头的相对引用是 称为绝对路径引用。一个相对参考 不以斜线字符开头的称为相对路径引用。

    【讨论】:

    • 很高兴知道,但这与流行浏览器的兼容性如何。快速搜索告诉我它不适用于 IE6...这是 HTML5 功能吗??
    • @Shane 这应该适用于所有浏览器。您是否有声称它在 IE6 中不起作用的链接?
    • 很确定这是 IE1 的功能!
    • 加号用于提及协议相关
    【解决方案3】:

    它们是独立于协议的 URL。如果网页在 https 上提供,则请求使用 https,如果是 http,则使用 http。

    Paul Irish 似乎通过将其包含在他的样板代码中来普及它们。

    【讨论】:

      【解决方案4】:

      注意它不仅独立于http或https,还独立于file、ftp、等等。

      这意味着如果您直接在本地主机上的浏览器中打开 .htm 文件,浏览器会将 // 解析为文件协议和您的页面不会工作。使用 Electron、PhoneGap 等工具,它可能会导致打包网站作为“原生”应用程序出现问题。

      例子:

      <script src="//mywebsite.com/resource.js"></script>
      

      到

      <script src="file://mywebsite.com/resource.js"></script>
      

      【讨论】:

        猜你喜欢
        • 2011-11-08
        • 2012-01-05
        • 1970-01-01
        • 2016-09-28
        • 2017-08-12
        • 2016-05-21
        • 2012-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多