【发布时间】:2011-02-13 02:36:15
【问题描述】:
我正在向页眉和页脚添加一个外部 CSS 文件和一个外部 JS 文件。 加载 HTTPS 页面时,一些浏览器抱怨我正在加载不安全的内容。
当页面本身是 HTTPS 时,有没有一种简单的方法可以让浏览器通过 HTTPS 加载外部内容?
【问题讨论】:
标签: javascript html css https
我正在向页眉和页脚添加一个外部 CSS 文件和一个外部 JS 文件。 加载 HTTPS 页面时,一些浏览器抱怨我正在加载不安全的内容。
当页面本身是 HTTPS 时,有没有一种简单的方法可以让浏览器通过 HTTPS 加载外部内容?
【问题讨论】:
标签: javascript html css https
使用协议相对路径。
所以不是
<link rel="stylesheet" href="http://example.com/style.css">
<script src="http://example.com/script.js"></script>
不过如此
<link rel="stylesheet" href="//example.com/style.css">
<script src="//example.com/script.js"></script>
那么它将使用父页面的协议。
【讨论】:
https://。无论方案如何,它们都会在您的页面中正常加载
nute 和 James Westgate 在评论后面的答案时是对的。
如果我们看一下各种工业级外部 javascript 包含,成功的会同时使用 document.location.protocol 嗅探和脚本元素注入,并使用正确的协议。
所以你可以使用类似的东西:
<script type="text/javascript">
var protocol = (
("https:" == document.location.protocol)
? "https"
: "http"
);
document.write(
unescape(
"%3Cscript"
+ " src='"
+ protocol
+ "://"
+ "your.domain.tld"
+ "/your/script.js"
+ "'"
+ " type='text/javascript'
+ "%3E"
+ "%3C/script%3E"
) // this HAS to be escaped, otherwise it would
// close the actual (not injected) <script> element
);
</script>
对于外部 CSS 包含也可以这样做。
顺便说一句:请注意仅在 CSS 中使用相对 url() 路径(如果有),否则您可能仍会收到“混合安全和不安全”警告......
【讨论】:
如果您使用相对路径(并且内容位于同一域中),则内容应使用请求页面的协议。
但是,如果您要跨域访问 CDN 或资源站点,或者如果您需要使用绝对路径,那么您将需要使用服务器端脚本来更改链接,或者始终使用 https://
【讨论】:
与转义响应相反(这也可以),您可以跳过该部分并使用正确的方式将节点添加到您的 dom 树:
<script type="text/javascript" language="javascript">
var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", document.location.protocol + '//www.mydomain.com/script.js');
document.getElementsByTagName("head")[0].appendChild(fileref);
</script>
但协议相对路径将是要走的路。
【讨论】: