以两个斜杠开头的URI……它们的行为如何?


92

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

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

Answers:


86

您正在寻找的资源是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"

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


4
所以这可以成为使用javascript以这种方式确定http或https的解决方案
吗(伊布,

由于您需要达到父级,请使用../g-它会使用当前协议并指向http://a/b/c/g
鲍里斯S

这可能是一个新手问题,但是此基本URI是从哪里来的?浏览器网址栏?服务器?HTML页面中的标签?
coderatchet 2014年

1
@thenaglecode:答案是,这取决于。在XML / XHTML / HTML5,您可以使用xml:base显式设置任何元素。默认情况下,HTML中的基本URI是页面的相同URI(但在CSS文件中,基本URI是相对于CSS uri的,而不是包含HTML的HTML,但是较旧的IE却是相对于HTML的)。在其他协议和语言中,它可以不同(例如,在XSLT中,它取决于当前项目)。另请参阅<html:base>
Abel 2014年

1
重要-结果并不总是如此http!它取决于页面上下文的协议。如果将上下文加载到http://a/b/c/d;p?q,则//g确实解析为http://g。但是,如果页面按原样加载,http://a/b/c/d;p?q则结果为https://g。并且也不要忘记其他协议,例如file://(页面是从磁盘加载的),这肯定会让您头疼。
Andrey Tserkus '16

62

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

此表示法通常用于避免“混合内容”问题(IE警告消息抱怨httphttpsHTTPS页面上存在资源)。

更新:RFC 3986中的官方文档

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


很高兴知道,但是这与流行的浏览器的兼容性如何。快速搜索告诉我它不适用于IE6 ...这是HTML5功能吗?
Shane N

4
@Shane应该适用于所有浏览器。您是否有一个链接声称它在IE6中不起作用?
Pekka

4
相当确定这是IE1的功能!
乔恩·汉娜

再加上提及协议的相对者
Tawfik Khalifeh 2014年


1

请注意,它不仅独立于httphttps,而且还独立于fileftp等。

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

例:

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

<script src="file://mywebsite.com/resource.js"></script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.