这不是简单的阅读,但是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获得。
这是完全跨浏览器兼容吗?还有其他警告吗?
答案 0 :(得分:201)
我在发布前彻底测试了它。在Browsershots上可以测试的所有浏览器中,我只能找到一个没有正确处理协议相对URL的浏览器:一个名为Dillo的模糊* nix浏览器。
我收到的反馈有两个缺点:
答案 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;