我有以下元素:
<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:?
它似乎在我测试过的所有地方都有效,但是否有任何情况下它不起作用?
这的确是正确的,正如其他答案所陈述的那样。但是你应该注意,一些网络爬虫会通过在你的服务器上请求它们来设置404,就像一个本地URL一样。(他们忽略了双斜杠,将其视为单斜杠)。
你可能想要在你的web服务器上设置一个规则来捕捉这些并重定向它们。
例如,在Nginx中,你可以添加如下内容:
location ~* /(?<redirect_domain>((([a-z]|[0-9]|\-)+)\.)+([a-z])+)/(?<redirect_path>.*) {
return 301 $scheme:/$redirect_domain/$redirect_path;
}
但是要注意,如果在uri中使用句点,则需要增加特异性,否则最终会将这些页面重定向到不存在的域。
而且,对于每个查询来说,这是一个相当庞大的正则表达式——在我看来,对于大多数兼容的浏览器来说,用404来惩罚不兼容的浏览器是值得的。
它保证可以在任何主流浏览器上运行(我没有考虑市场份额低于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)时,你可以省略这些部分,总是从左边开始。在伪代码中,它看起来像这样:
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是一个无方案的相对URI。
在这里,我在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.