154

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

例如:

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

例如:

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

6 回答 6

90

如果浏览器支持RFC 1808 Section 4RFC 2396 Section 5.2RFC 3986 Section 5.2,那么它确实会使用页面 URL 的方案来引用以“//”开头的引用。

于 2011-01-11T19:43:11.463 回答
66

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

2014 年更新:

既然所有人都鼓励使用SSL ,并且没有性能问题,那么这种技术现在是一种反模式。如果您需要的资产在 SSL 上可用,则始终使用该https://资产。

于 2011-01-11T19:45:20.140 回答
65

如果在网页上下文之外查看您的 URL,则会出现一个缺点。例如,位于电子邮件客户端(例如 Outlook)中的电子邮件实际上没有 URL,当您查看包含协议相关 URL 的消息时,根本没有明显的协议上下文(消息本身是独立的用于获取它的协议(无论是 POP3、IMAP、Exchange、uucp 还是其他),因此 URL 没有相关的协议。我还没有调查与电子邮件客户端的兼容性,以查看它们在缺少协议处理程序时会做什么——我猜大多数人会猜测 http。Apple Mail 拒绝让您输入没有协议的 URL。这类似于相对 URL 由于缺少上下文而在电子邮件中不起作用的方式。

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

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

于 2012-10-15T15:40:35.097 回答
3

原因可能是提供可移植的网页。如果外页没有加密传输(http),为什么要加密链接的脚本?这似乎是不必要的性能损失。如果外部页面是安全传输的加密 (https),​​那么链接的内容也应该被加密。如果页面是加密的,链接的内容没有,IE 似乎会发出混合内容警告。原因是攻击者可以在途中操纵脚本。有关更长的讨论,请参阅http://ie.microsoft.com/testdrive/Browser/MixedContent/Default.html?o=1

EFF的HTTPS Everywhere活动建议尽可能使用 https。如今,我们拥有服务器容量来提供始终加密的网页。

于 2013-12-15T17:24:24.837 回答
1

只是为了完整性。这在另一个线程中提到:

“两个正斜杠”是“现在正在使用的任何协议”的常用简写

if (plain http environment) {
    use 'http://example.com/my-resource.js'
} else {
    use 'https://example.com/my-resource.js'
}

请检查完整的线程。

于 2014-01-13T14:28:24.153 回答
-2

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

于 2014-02-21T06:47:31.337 回答