我有一个从外部域加载图像的样式表,我需要它根据当前 URL 从安全订单页面的 https:// 和其他页面的 http:// 加载。我发现以双斜杠开头的 URL 继承了当前协议。所有浏览器都支持这种技术吗?
例如:
<img src="//cdn.domain.com/logo.png" />
例如:
.class { background: url(//cdn.domain.com/logo.png); }
我有一个从外部域加载图像的样式表,我需要它根据当前 URL 从安全订单页面的 https:// 和其他页面的 http:// 加载。我发现以双斜杠开头的 URL 继承了当前协议。所有浏览器都支持这种技术吗?
例如:
<img src="//cdn.domain.com/logo.png" />
例如:
.class { background: url(//cdn.domain.com/logo.png); }
如果浏览器支持RFC 1808 Section 4、RFC 2396 Section 5.2或RFC 3986 Section 5.2,那么它确实会使用页面 URL 的方案来引用以“//”开头的引用。
在link
or上使用时@import
,IE7/IE8 将根据http://paulirish.com/2010/the-protocol-relative-url/下载文件两次
2014 年更新:
既然所有人都鼓励使用SSL ,并且没有性能问题,那么这种技术现在是一种反模式。如果您需要的资产在 SSL 上可用,则始终使用该
https://
资产。
如果在网页上下文之外查看您的 URL,则会出现一个缺点。例如,位于电子邮件客户端(例如 Outlook)中的电子邮件实际上没有 URL,当您查看包含协议相关 URL 的消息时,根本没有明显的协议上下文(消息本身是独立的用于获取它的协议(无论是 POP3、IMAP、Exchange、uucp 还是其他),因此 URL 没有相关的协议。我还没有调查与电子邮件客户端的兼容性,以查看它们在缺少协议处理程序时会做什么——我猜大多数人会猜测 http。Apple Mail 拒绝让您输入没有协议的 URL。这类似于相对 URL 由于缺少上下文而在电子邮件中不起作用的方式。
类似的问题可能发生在其他非 HTTP 上下文中,例如推文、SMS 消息、Word 文档等。
更一般的解释是匿名协议 URL 不能孤立地工作;必须有相关的背景。在典型的网页中,以这种方式引入脚本库是可以的,但任何外部链接都应始终指定协议。我确实尝试了一个简单的测试://stackoverflow.com
映射到file:///stackoverflow.com
我尝试过的所有浏览器,所以它们真的不能自己工作。
原因可能是提供可移植的网页。如果外页没有加密传输(http),为什么要加密链接的脚本?这似乎是不必要的性能损失。如果外部页面是安全传输的加密 (https),那么链接的内容也应该被加密。如果页面是加密的,链接的内容没有,IE 似乎会发出混合内容警告。原因是攻击者可以在途中操纵脚本。有关更长的讨论,请参阅http://ie.microsoft.com/testdrive/Browser/MixedContent/Default.html?o=1。
EFF的HTTPS Everywhere活动建议尽可能使用 https。如今,我们拥有服务器容量来提供始终加密的网页。
只是为了完整性。这在另一个线程中提到:
if (plain http environment) {
use 'http://example.com/my-resource.js'
} else {
use 'https://example.com/my-resource.js'
}
请检查完整的线程。
现在这似乎是一种非常普遍的技术。没有缺点,它只有助于统一页面上所有资产的协议,因此应尽可能使用。