用<script src =“http:// …”>replacehttp://是否有效?

我有以下元素:

<script type="text/javascript" src="https://cdn.example.com/js_file.js"></script> 

在这种情况下,该网站是HTTPS,但该网站也可能只是HTTP。 (该JS文件是在另一个域上。)我想知道是否有效,为方便起见,请执行以下操作:

 <script type="text/javascript" src="//cdn.example.com/js_file.js"></script> 

我想知道是否有效删除http:https:

这似乎在我testing过的任何地方都能正常工作,但是在任何情况下,它都不起作用。

根据RFC 3986:“统一资源标识符(URI):通用语法”(第4.2节) ,没有scheme(http:或https :)的相对URL是有效的。 如果一个客户端扼杀它,那么这是客户端的错,因为它们不符合在RFC中指定的URI语法。

你的例子是有效的,应该工作。 我已经在stream量很大的网站上使用了这种相对的URL方法,并没有任何投诉。 此外,我们在Firefox,Safari,IE6,IE7和Operatesting我们的网站。 这些浏览器都了解URL格式。

这是保证在任何主stream浏览器(我不考虑浏览器低于0.05%的市场份额考虑)工作。 哎呀,它在Internet Explorer 3.0中工作。

RFC 3986将URI定义为由以下部分组成:

  foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment 

在定义相对URI( 第5.2节 )时,可以忽略任何这些节,总是从左边开始。 在伪代码中,它看起来像这样:

  result = "" if defined(scheme) then append scheme to result; append ":" to result; endif; if defined(authority) then append "//" to result; append authority to result; endif; append path to result; if defined(query) then append "?" to result; append query to result; endif; if defined(fragment) then append "#" to result; append fragment to result; endif; return result; 

您所描述的URI是一个无scheme的相对URI。

有没有任何情况下,它不工作?

如果父页面是从file://加载的,那么它可能不起作用(它会尝试获取file://cdn.example.com/js_file.js ,这当然也可以在本地提供)。

许多人称这是一个协议相对URL。

它导致在IE 7和8中CSS文件的双重下载 。

在这里我重复HTML的隐藏function的答案:

使用独立于协议的绝对path:

 <img src="//domain.com/img/logo.png"/> 

如果浏览器正在通过HTTPS查看SSL中的页面,则会使用https协议请求该资产,否则将使用HTTP请求该资源。

这可以防止在IE中出现可怕的“本页包含安全和非安全项目”错误消息,将您的所有资产请求保留在相同的协议中。

警告:在样式表的<link>或@import上使用时,IE7和IE8 下载文件两次 。 但是,所有其他用途都很好。

离开协议是完全有效的。 这个URL规范多年来一直很清楚,我还没有find一个不理解它的浏览器。 我不知道为什么这个技术不是更好的了解; 它是跨越HTTP / HTTPS边界的棘手问题的完美解决scheme。 更多这里: http-https转换和相对URL

有没有任何情况下,它不工作?

只是把这个混在一起,如果你正在本地服务器上开发,它可能无法工作。 您需要指定一个scheme,否则浏览器可能会认为src="//cdn.example.com/js_file.js"src="file://cdn.example.com/js_file.js" ,将会中断因为你不是在本地托pipe这个资源。

Microsoft Internet Explorer似乎对此特别敏感,请参阅此问题: 无法在本地主机上的Internet Explorer(WAMP)中加载jQuery

您可能总是试图find一个适用于所有环境的解决scheme,并且所需的修改量最less。

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

 <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> 

更新: HTML5Boilerplate在决定弃用协议相对URL后,现在使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js ,参见[here] [3] 。

遵循gnud的参考, RFC 3986第5.2节说:

如果scheme组件被定义,指示引用以scheme名称开始,则引用被解释为绝对URI,并且我们完成了。 否则,引用URI的scheme是从基URI的scheme组件inheritance的

所以//是正确的:-)

是的,这是在RFC 3986第5.2节中logging的:

(编辑:哎呀,我的RFC参考已经过时了)。

正如其他答案所述,这确实是正确的。 不过,你应该注意到,一些networking爬虫将通过在你的服务器上请求它们,如同一个本地URL一样,为这些爬虫设置404s。 (他们无视双斜线,把它当作一个斜线)。

您可能需要在您的networking服务器上设置一个规则来捕获这些规则并redirect它们。

例如,用Nginx,你可以添加如下内容:

 location ~* /(?<redirect_domain>((([az]|[0-9]|\-)+)\.)+([az])+)/(?<redirect_path>.*) { return 301 $scheme:/$redirect_domain/$redirect_path; } 

但请注意,如果在URI中使用句点,则需要增加特殊性,否则将最终将这些页面redirect到不存在的域。

此外,这是一个相当大规模的正则expression式来运行每个查询 – 在我看来,这是值得惩罚不合规的浏览器与404s超过(略)性能打击大多数兼容的浏览器。

当使用//somedomain.com作为JS文件的引用时,我们在日志中看到404错误。

导致404s的引用出现如下所示:ref:

 <script src="somescript.js" /> 

404请求:

 http://mydomain.comsomescript.js 

有了这些定期在我们的Web服务器日志中显示,可以肯定地说:所有的浏览器和机器人遵守RFC 3986第4.2节。 最安全的select是尽可能包括协议。

我在html5-boilerplate上看到的模式是:

 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script> 

它运行在不同的计划,如httphttpsfile