最近我看到像这样的可工作的代码块:
<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吗?
最近我看到像这样的可工作的代码块:
<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吗?
你要寻找的资源是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
。这些是协议相对URL。它们指向一个地址,保持当前的协议。
这种表示法经常用于避免“混合内容”问题(IE警告消息抱怨在同一HTTPS页面上使用http
和https
资源)。
更新:官方文档在RFC 3986中:
以两个斜杠字符开头的相对引用被称为网络路径引用;这种引用很少使用。以单个斜杠字符开头的相对引用被称为绝对路径引用。不以斜杠字符开头的相对引用被称为相对路径引用。
<script src="//mywebsite.com/resource.js"></script>
to
<script src="file://mywebsite.com/resource.js"></script>
../g
- 它将使用当前协议并导向http://a/b/c/g
。 - Boris Sxml:base
来在任何元素上明确设置它。在 HTML 中,默认的基本 URI 是相同的页面 URI(但在 CSS 文件中,基本 URI 是相对于 CSS URI 而不是包含 HTML 的 URI,但旧版 IE 将其设置为相对于 HTML)。在其他协议和语言中,可能会有所不同(例如,在 XSLT 中,它取决于当前项目)。另请参见<html:base>
。 - Abelhttp
!它取决于页面上下文的协议。如果上下文是在http://a/b/c/d;p?q
下加载的,那么//g
确实会解析为http://g
。但如果页面是作为http://a/b/c/d;p?q
加载的,则结果将为https://g
。还要记得其他协议,如file://
(从磁盘加载页面)- 这肯定会让你头疼不已。 - Andrey Tserkus