为什么要使用协议相关的 URL?

Why use protocol-relative URLs at all?

在 Whosebug 上经常讨论这意味着什么:

 <script src="//cdn.example.com/somewhere/something.js"></script>

这样做的好处是,如果您通过 HTTPS 访问它,您会自动获得 HTTPS,而不是那个可怕的 "Insecure elements on this page" 警告。

但为什么要使用协议相关 URL?为什么不总是在 CDN URL 中简单地使用 HTTPS?毕竟,如果您决定通过 HTTPS 加载 HTTP 页面的某些部分,那么它没有理由抱怨。

(这更专门针对 CDN;几乎所有 CDN 都具有 HTTPS 功能。而您自己的服务器不一定具有 HTTPS。)

因为性能。建立 HTTPS 连接所需的时间比 HTTP 长得多,TLS 握手将延迟延迟最多增加 2 RTT 秒。您可以在移动网络上注意到它。因此,如果不需要,最好不要使用 HTTPS 资产 URL。

截至 2014 年 12 月,Paul Irish's blog on protocol-relative URLs 表示:

2014.12.17: Now that SSL is encouraged for everyone and doesn’t have performance concerns, this technique is now an anti-pattern. If the asset you need is available on SSL, then always use the https:// asset.

除非您有特定的性能问题(例如 Zakjan 的回答中提到的移动网络速度慢),否则您应该使用 https:// 来保护您的用户。

有一点需要注意,如果您使用的是 CSP 的 upgrade-insecure-requests,则可以安全地使用与协议无关的 URL (//example.com)。

有很多潜在的原因,尽管它们都不是特别重要:

  • 下一次每个有议程的企业推动新协议怎么样?那么我们是否必须再次换出数千个字符串?不,谢谢。
  • HTTPS 比同版本的 HTTP 慢
  • 如果 HTTP/2 的 the notes listed at caniuse.com 有任何问题
  • 从概念上讲,如果服务器强制执行该协议,那么一开始就没有理由对其进行具体说明。不可知论就是这样。它涵盖了您的所有基地。

相对于协议的 URL 有时会破坏试图检测 location.protocol 的 JS 代码。极旧的浏览器也不理解它们。如果您正在开发需要最大向后兼容性的 Web 服务(即在慢速连接 and/or 旧设备上提供可能 received/sent 的关键紧急信息),请不要使用 PRURL。