使用//而不是prototcol

Dav*_*ing 6 javascript jquery load protocols require

可能重复:
使用前导双斜杠继承URL中的协议是否有任何缺点?即src ="// domain.com"

我在许多地方看到了以下逻辑,f.ex分析脚本:

script.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://example.com/cdn.js';
Run Code Online (Sandbox Code Playgroud)

但据我所知,您也可以这样做:

script.src = '//example.com/cdn.js';
Run Code Online (Sandbox Code Playgroud)

它应该使用当前使用的任何协议.或者我错过了什么?什么被认为是"最佳实践"?

我不是在寻找浏览器兼容性答案,谷歌已经建议//使用CDN脚本,所以在这里不应该这样.

这是一个小提琴,但它并没有说它似乎在这个设置中工作:http://jsfiddle.net/6ZGyb/

Til*_*ave 5

一点背景:

附加的JavaScript protocol包装器通常用于确保所有浏览器支持这样的relative path URLs.你是正确的,假设大多数当前的浏览器无论如何都能正确处理这些URL,但是为了能够以休息的心态入睡,通常认为一个好的做法是假设并非所有访问你网页的用户代理都是精明的因为我们希望他们是(或支持RFC 1808第4节,RFC 2396第5.2节,或RFC 3986第5.2节如已经提到是否有使用领先的双斜线继承的URL协议?任何下行线正如@Bruno在评论中指出的那样)

兼容性问题:

想象一下这样一种场景,其中包含这种相对路径的内容可以在"超出上下文"的情况下访问,例如在电子邮件客户端中.在这种情况下,这些相对路径可能以错误的方式被解析为它们的完全限定路径,并且导致各种问题,从用户不能正确地看到内容,到访问他们实际上不应该的内容.为了避免任何此类问题,相对路径的使用应始终限于上下文情况,其中父文档(开启者应用程序)的解析器可以确定所讨论资源的完整绝对路径.您应该只期望相对路径在通过相同或兼容的协议访问时才能正常工作.

安全问题:

提出的另一个可能的问题是:

这些相对协议URL是否可以通过各种交换协议访问(解析的URL)父文档内容而以任何方式被利用,并且如果这样的JavaScript包装器用于偏转这种访问的目的.

官方IANA注册URL方案的(长)列表表明,开发人员可能会使用许多可能令人担忧的交换协议,但是对于不支持JavaScript的用户代理,JavaScript不会做太多任何事情(或者是用户禁用).考虑到这一点,我的答案必须是 - 否(对于'使用其他协议的JavaScript保护访问'部分).

至于引起关注的剩余部分("可以以任何方式利用这样的相关协议URL"),答案取决于在设置服务于任何此类内容的Web服务器时的考虑程度,它是否支持/处理这样的请求(如果没有那么这是一个非问题),并在部署之前考虑了什么可能的攻击/内容盗窃的向量.换句话说,这是一个Web服务器管理问题,当然不是Web设计人员/程序员可以/应该回答的问题.每个最终用户可访问的协议都应该有自己的一组安全协议.