以两个斜杠开头的URI...它们的行为是怎样的?

95

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

<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吗?

4个回答

88

你要寻找的资源是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

4
这能否成为使用JavaScript确定HTTP或HTTPS的解决方案?这样无论是什么,都可以正常工作。 - Ibu
由于您需要到达父级别,请使用../g - 它将使用当前协议并导向http://a/b/c/g - Boris S
这可能是一个初学者的问题,但是这个基本URI从哪里来?浏览器URL栏?服务器?HTML页面中的标签? - coderatchet
1
@thenaglecode:答案是,这要看情况。在 XML/XHTML/HTML5 中,您可以使用 xml:base在任何元素上明确设置它。在 HTML 中,默认的基本 URI 是相同的页面 URI(但在 CSS 文件中,基本 URI 是相对于 CSS URI 而不是包含 HTML 的 URI,但旧版 IE 将其设置为相对于 HTML)。在其他协议和语言中,可能会有所不同(例如,在 XSLT 中,它取决于当前项目)。另请参见 <html:base> - Abel
1
重要提示 - 结果并不总是 http!它取决于页面上下文的协议。如果上下文是在 http://a/b/c/d;p?q 下加载的,那么 //g 确实会解析为 http://g。但如果页面是作为 http://a/b/c/d;p?q 加载的,则结果将为 https://g。还要记得其他协议,如 file://(从磁盘加载页面)- 这肯定会让你头疼不已。 - Andrey Tserkus

64

这些是协议相对URL。它们指向一个地址,保持当前的协议。

这种表示法经常用于避免“混合内容”问题(IE警告消息抱怨在同一HTTPS页面上使用httphttps资源)。

更新:官方文档在RFC 3986中:

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


很好知道,但这在流行的浏览器中有多兼容?快速搜索告诉我它不适用于IE6...这是HTML5的一个特性吗? - Shane N
4
@Shane,这应该适用于所有浏览器。你有一个链接声称在IE6中无法工作吗? - Pekka
4
我相当肯定那是IE1的功能! - Jon Hanna
提及协议相对路径时,请使用加号。 - Tawfik Khalifeh

30

它们是协议无关的URL。如果网页使用https服务,则请求使用https,如果使用http,则使用http。

Paul Irish似乎通过将其包含在他的样板代码中而使它流行起来。


2
请注意,这不仅与 httphttps 有关,还与 fileftp 等协议有关。
这意味着,如果您在本地主机上直接在浏览器中打开 .htm 文件,则浏览器将解析//为文件协议,导致您的页面无法工作。这可能会在打包网站作为“原生”应用程序使用 Electron、PhoneGap 等工具时出现问题。
示例:
<script src="//mywebsite.com/resource.js"></script>

to

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

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