我可以将所有http://链接更改为//吗?

时间:2011-01-28 18:29:26

标签: http url https protocol-relative

Dave Ward说,

  

这不是简单的阅读,但是section 4.2 of RFC 3986提供了完全限定协议(HTTP或HTTPS)的完全限定的URL。当省略URL的协议时,浏览器会使用基础文档的协议。

     

简而言之,这些“无协议”网址允许这样的引用在您尝试使用的每个浏览器中都有效:

     

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

     

起初看起来很奇怪,但这种“无协议”URL是引用通过HTTP和HTTPS提供的第三方内容的最佳方式。

这肯定会解决我们在HTTP页面上看到的一堆混合内容错误 - 假设我们的资产可以通过HTTP和HTTPS获得。

这是完全跨浏览器兼容吗?还有其他警告吗?

7 个答案:

答案 0 :(得分:201)

我在发布前彻底测试了它。在Browsershots上可以测试的所有浏览器中,我只能找到一个没有正确处理协议相对URL的浏览器:一个名为Dillo的模糊* nix浏览器。

我收到的反馈有两个缺点:

  1. 当您在浏览器中“打开”本地文件时,无协议URL可能无法正常工作,因为该页面的基本协议将为file:///。特别是当您使用无协议URL作为CDN托管资产等外部资源时。使用Apache或IIS等本地Web服务器来测试http://localhost地址可以正常工作。
  2. 显然,至少有一个iPhone Feed阅读器应用程序无法正确处理无协议URL。我不知道哪个有问题或有多受欢迎。对于托管JavaScript文件,这不是一个大问题,因为RSS阅读器通常无论如何都会忽略JavaScript内容。但是,如果您将这些URL用于需要通过RSS进行联合的内容中的图像(例如,单个平台上的这个单一阅读器应用程序可能占读者的数量非常少),则可能会出现问题。 / LI>

答案 1 :(得分:37)

考虑到一个是否应这样做的问题,一个是否将所有链接更改为协议相关的问题可能没有实际意义。根据{{​​3}}:

  

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

答案 2 :(得分:30)

如果您使用无协议的URL来加载样式表,IE 7& 8将下载两次: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/

因此,如果你喜欢良好的表现,那就要避免使用CSS。

答案 3 :(得分:15)

是的,网络路径引用已在RFC 1808中指定,并且应该适用于所有浏览器。

答案 4 :(得分:4)

  

这是完全跨浏览器兼容吗?还有其他警告吗?

只是把它放在混合中,如果你在本地服务器上进行开发,它可能无法正常工作。您需要指定一个方案,否则浏览器可能会认为src="//cdn.example.com/js_file.js"src="file://cdn.example.com/js_file.js",由于您未在本地托管此资源,因此会暂停。

Microsoft Internet Explorer似乎对此特别敏感,请参阅此问题:Not able to load jQuery in Internet Explorer on localhost (WAMP)

您可能总是试图找到适用于所有环境的解决方案,并且需要进行最少量的修改。

HTML5Boilerplate使用的解决方案是在资源未正确加载时进行回退,但只有在合并检查时才有效:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

我也发布了这个答案here

更新:HTML5Boilerplate现在在决定弃用协议相对网址后使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">,请参阅here

答案 5 :(得分:1)

使用时,我没有遇到过这些问题://domain.com - 但您确实需要在开头添加冒号。有一段时间,Yoast对此有一个很好的写作。但它在一堆博客文章中丢失了。

答案 6 :(得分:0)

如果您想确保所有请求都升级到安全协议,则可以使用简单的选项使用内容安全策略标头 upgrade-insecure-requests

Content-Security-Policy: upgrade-insecure-requests;

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests