使用前导双斜杠继承URL中的协议是否有任何弊端?即src =“ // domain.com”


148

我有一个样式表,可从外部域加载图像,并且需要基于当前URL从安全订单页面的https://和其他页面的http://加载。我发现以双斜杠开头的URL会继承当前协议。所有浏览器都支持此技术吗?

html前:

<img src="//cdn.domain.com/logo.png" />

css ex:

.class { background: url(//cdn.domain.com/logo.png); }

1
这会使网站变慢吗???
TheBlackBenzKid 2011年

2
没有任何理由会对性能产生任何影响,除非Meder在她的回答中列出了以下情况。
罗伯·沃尔克

好像我在做某事。几个月前,Google开发人员开始在其托管Javascript库页面上使用此约定developer.google.com/speed/libraries/devguide
Rob Volk

10
如果将这样的HTML文件本地加载(直接用浏览器打开)怎么办?看起来像Firefox(在本例中为28)然后不加载远程资源。这是有道理的,因为HTTP不是父协议。但我认为这将是不利的。
Jan-Philip Gehrcke博士2014年

Answers:


86

如果浏览器支持RFC 1808第4节RFC 2396第5.2节RFC 3986第5.2节,则它将确实使用页面URL的方案对以“ //”开头的引用。


8
所有主流浏览器都支持此功能吗?(IE7,IE8,FF,Chrome,Safari)
Rob Volk

22
考虑到描述它的第一个RFC是RFC 1808,它是15年前编写的,URL引用是网站功能的关键,我可以肯定地说,到目前为止,几乎所有主流浏览器都支持它。但是唯一可以确定的方法是自己尝试一下,看看会发生什么。
雷米·勒博

2
这个问题与有人问类似问题有关,我在前一年的RFC 1630中找到了它(表示方式有所不同,但仍允许使用该格式)。ftp://info.cern.ch/pub/www/doc/http-spec.txt如果有人有档案副本,它很可能是1991年开始的一种形式或其他形式。
乔恩·汉纳

4
“ 2014.12.17:现在,所有人都应该鼓励使用SSL协议,而不必担心性能问题,现在,这项技术已成为一种反模式。如果您需要的资产在SSL上可用,则始终使用https://资产。” (引自stackoverflow.com/a/27999789的引用)
joonas.fi,2015年

@ joonas.fi这种推理是愚蠢的。SSL仍然会影响性能,并且在许多应用程序中都不需要SSL。当然,我更喜欢使用它,但是我不想在我部署的代码中强制使用它。
Otheus

64

link或上使用时@import,IE7 / IE8会根据http://paulirish.com/2010/the-protocol-relative-url/两次下载文件

从2014年起更新:

现在,所有人都应该鼓励使用 SSL 并且不必担心性能问题现在这种技术已成为一种反模式。如果您所需的资产在SSL上可用,请始终使用https://资产。


18
已在IE9,FWIW中修复。
EricLaw 2011年

@EricLaw是否已在IE9中修复,而不管渲染模式如何,还是仅在标准模式下修复了,而在Quirks模式下仍然无效?
scunliffe

我几乎可以肯定的是,在超前扫描仪的所有模式下均已解决此问题。您是否在其他地方看到过?
EricLaw 2013年

SSL当然确实会对性能产生影响。EFF不会编写服务器-服务器接口,并且该其他站点的技术专家很少。此外,假定网站的卖方将强制执行此类限制是一种反模式。因此,人们编写CSS和javascript应用程序时不应依赖协议问题。
Otheus

63

如果您的URL是在网页上下文之外查看的,则可能会带来不利影响。例如,位于电子邮件客户端(例如Outlook)中的电子邮件实际上没有URL,并且当您查看包含相对协议URL的消息时,根本没有明显的协议上下文(消息本身是独立的(用于POP3,IMAP,Exchange,uucp或其他任何协议)获取URL的协议,因此该URL没有相对的协议。我尚未调查与电子邮件客户端的兼容性,以查看在缺少协议处理程序时电子邮件客户端的功能-我想大多数人都会在http上猜测。Apple Mail拒绝让您输入没有协议的URL。这类似于由于上下文相似而导致相对URL在电子邮件中不起作用的方式。

在其他非HTTP上下文中,例如在推文,SMS消息,Word文档等中,也可能发生类似的问题。

更笼统的解释是匿名协议URL不能孤立运行。有必须是一个相关背景。因此,在典型的网页中,可以通过这种方式引入脚本库,但是任何外部链接都应始终指定协议。我确实尝试了一个简单的测试:在我尝试过的所有浏览器中都//stackoverflow.com映射到file:///stackoverflow.com它,因此它们真的不能单独工作。


5
这是一个很好的观点,我昨晚睡着时实际上是在考虑这一点。另一个问题是httpsor http版本可能实际上不可用,您不能始终假设它是可用的。
韦斯利·默奇

1
可以这么说,在浏览器之外您是一个人。没有电子邮件或其他客户端知道javascript或css等的说法。因此,这几乎是有关相对URL的争议点?
克里斯

尚无定论。许多电子邮件客户端支持JS,而从中加载时,浏览器当然可以file://。这是一个较小的用例,但是重要的是。
2014年

我确实希望有一种方法可以指定使用http,除非当前的URL是https,在这种情况下,请使用https,而不是指定使用与当前页面加载了相同的协议,实际上//就是这样。
2014年

2
如果指定了eg <base href="https://www.google.com">,则可以在网络外部查看内容。无论是<img src="//www.google.com/images/srpr/logo11w.png"><img src="images/srpr/logo11w.png">
锯齿

3

原因可能是提供便携式网页。如果外部页面未传输加密(http),为什么应该对链接脚本进行加密?这似乎是不必要的性能损失。万一外部页面被安全地传输加密(https),则链接的内容也应该被加密。如果页面已加密,则链接的内容未加密,IE似乎发出了混合内容警告。原因是攻击者可以在途中操纵脚本。请参阅http://ie.microsoft.com/testdrive/浏览器/MixedContent/Default.html?o=1讨论,。

EFF 的HTTPS Everywhere广告系列建议尽可能使用https。如今,我们具有服务器能力,可以服务始终加密的网页。



-2

现在看来这是一种非常普遍的技术。没有缺点,它仅有助于统一页面上所有资产的协议,因此应尽可能使用。

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.