我有以下元素:

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

它似乎在我测试过的所有地方都有效,但是否有任何情况下它不起作用?


当前回答

不使用协议是完全合理的。URL规范多年来一直对此非常明确,我还没有发现一个浏览器不理解这一点。我不知道为什么这个技巧不为人所知;它是跨越HTTP/HTTPS边界这一棘手问题的完美解决方案。更多信息:Http-https转换和相对url

其他回答

这的确是正确的,正如其他答案所陈述的那样。但是你应该注意,一些网络爬虫会通过在你的服务器上请求它们来设置404,就像一个本地URL一样。(他们忽略了双斜杠,将其视为单斜杠)。

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

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

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

但是要注意,如果在uri中使用句点,则需要增加特异性,否则最终会将这些页面重定向到不存在的域。

而且,对于每个查询来说,这是一个相当庞大的正则表达式——在我看来,对于大多数兼容的浏览器来说,用404来惩罚不兼容的浏览器是值得的。

是的,这在RFC 3986章节5.2中有记录:

(编辑:哎呀,我的RFC引用过时了)。

由于您的示例链接到外部域,如果您使用的是HTTPS,那么您应该验证外部域也为SSL设置了。否则,您的用户可能会看到SSL错误和/或404错误(例如,旧版本的Plesk将HTTP和HTTPS存储在单独的文件夹中)。对于cdn,这应该不是一个问题,但对于任何其他网站,这可能是一个问题。

另一方面,在更新旧网站时进行测试,也可以在META REFRESH的url=部分中工作。

在这里,我在HTML的隐藏特性中复制了答案:

Using a protocol-independent absolute path: <img src="//domain.com/img/logo.png"/> If the browser is viewing an page in SSL through HTTPS, then it'll request that asset with the https protocol, otherwise it'll request it with HTTP. This prevents that awful "This Page Contains Both Secure and Non-Secure Items" error message in IE, keeping all your asset requests within the same protocol. Caveat: When used on a <link> or @import for a stylesheet, IE7 and IE8 download the file twice. All other uses, however, are just fine.

根据gnud的引用,RFC 3986第5.2节说:

如果定义了方案组件,则指示引用 以方案名开始,然后引用被解释为 绝对URI,我们就完成了。否则,引用URI的方案 继承自基URI的方案组件。

所以//是正确的:-)