http - <script src=“http://…”>使用/ /有效替换http://?

  显示原文与译文双语对照的内容

我有以下元素:


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

在这种情况下,站点是 HTTPS,但站点也可能只是 HTTP 。 ( 文件位于另一个域中。) 我想知道为了方便起见,它是否有效:


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

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

它似乎在我测试的任何地方都能工作,但在任何情况下它都不能工作?

时间:

它可以在任何主流浏览器( 我没有考虑到小于 0.05 % 市场份额的浏览器) 中工作。 见鬼,它在 IE 3.0中工作。

RFC 3986 定义了一个 URI,由以下部分组成:


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

在定义相对 uri ( 节 5.2 ) 时,你可以忽略这些部分,总是从左边开始。 在pseudo-code中,它看起来像:


 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-less相对 URI 。

在任何情况下它无法工作?

如果父页面是从 file:// 加载的,那么它可能无法工作。

这确实是正确的,因为其他的答案已经。 但是,你应该注意,某些网站爬虫会在服务器上请求 404,就像本地URL一样。 ( 他们忽略了双斜杠,把它当作一个斜杠) 。

你可能需要在web服务器上设置一个规则来捕获这些规则并重定向它们。

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


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

请注意,如果你在uri中使用句点,你需要增加特殊性,或者将这些页面重定向到不存在的域。

在大部分兼容browsers,还上,这是个相当庞大的正规表达式 来是运行--为该查询在我看来,值得与 404 non-compliant筋疲力尽,浏览器的性能在一( 轻微) hit.

作为对JS的引用使用//somedomain.com files, when.我们看到他们在我们 404错误日志

引起 404的引用如下所示: 参考:


<script src="//somedomain.com/somescript.js"/>

404请求:


http://mydomain.com//somedomain.com/somescript.js

在我们的站点服务器日志中定期显示这些信息,可以说: 所有浏览器和 bot 荣誉 RFC 3986节 4.2. 最安全的赌注是尽可能包括协议。

...