2011-01-28 67 views
232

Dave Ward说,我可以将所有的http://链接改为//吗?

这不完全光阅读,但section 4.2 of RFC 3986提供了用于省略协议(HTTP或HTTPS)共完全合格的URL。当URL的协议被省略时,浏览器会使用底层文档的协议。

简单地说,这些“协议少”的URL允许这样的引用在每个浏览器工作,你会尝试在:

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

这看起来很奇怪在第一,但这个“协议无论“URL是引用通过HTTP和HTTPS可用的第三方内容的最佳方式。

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

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

+0

不久前,我在IE博客上讨论了这种技术。但是,当我尝试它时,它不能很好地工作。如果我的网站使用HTTPS,则浏览器(Chrome)仍在使用HTTP协议无法使用的网址。 – 2012-06-09 17:05:42

+9

警告:请记住永远不要在HTTP 3xx重定向用户无模式的URI! HTTP标头与此URL格式不兼容。如果您需要根据方案进行重定向,请使用mod_rewrite或类似方法。 – user2596282 2013-07-18 15:44:42

+1

@ user2596282在Chrome和Firefox的现代版本中进行的实验不同意你的看法,就像HTTP 1.1的(仍在草稿中)修订版一样。 spec由HTTPbis工作组定义(请参阅https://svn.tools.ietf.org/svn/wg/httpbis/draft-ietf-httpbis/latest/p2-semantics.html#header.location)。但是,也许你所说的某些浏览器是真的;你知道任何特别的位置标题中的协议相对URL失败吗? – 2013-07-21 19:06:43

回答

198

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

有我收到的意见反映两个缺点:

  1. 协议少如预期,当你“打开”在浏览器中的本地文件的URL可能无法工作,因为页面的基础协议将文件:///。特别是当您使用无协议URL来访问CDN托管资源等外部资源时。使用本地Web服务器如Apache或IIS来测试http://localhost地址的工作正常。
  2. 显然至少有一个iPhone提要阅读器应用程序不能正确处理无协议URL。我不知道哪一个有问题或者它有多受欢迎。对于托管JavaScript文件,这不是一个大问题,因为RSS阅读器通常无视JavaScript内容。但是,如果您将这些网址用于需要通过RSS进行联合播放的内容之类的媒体(例如,单个平台上的这种单一阅读器应用程序可能只占很少数量的阅读器),则可能会造成问题。
15

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

35

之一可能改变他们的所有链接是否是相对协议可能是没有实际意义,考虑是否一个应该问题这样做的问题。根据Paul Irish

2014.12.17:既然每个人都鼓励SSL,并且没有性能问题,现在这种技术是一种反模式。如果您需要的 资产在SSL上可用,则总是使用资产。

3

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

只是在混合使用中,如果您正在本地服务器上开发,它可能无法正常工作。您需要指定一个方案,否则浏览器可能会假设为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现在在决定弃用协议相对URL后使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">,请参阅here

2

使用时我还没有这些问题://domain.com - 但你确实需要在开头添加冒号。 Yoast很早就写了一篇这样的文章。但是在他的一堆博客文章中已经失去了它。

相关问题