Internet explorer jQuery.load(),混合了HTTP/HTTPS和Internet Explorer
我正试图使用Internet explorer jQuery.load(),混合了HTTP/HTTPS和Internet Explorer,internet-explorer,jquery,https,Internet Explorer,Jquery,Https,我正试图使用jQuery.load('https://someurl.com .someClass')。进行加载的页面位于HTTPS上;远程页面可作为HTTP和HTTPS使用。在合理的浏览器中,一切都可以正常工作,但IE发出了一个混合的HTTP/HTTPS内容安全警告——远程页面的HTTP链接中包含CSS和JS,即使请求为HTTPS。关于如何在IE中成功拉入混合内容文件而不触发警告,有什么线索吗?修改远程页面不是一个选项 编辑 要明确的是,我正在尝试通过HTTPS加载远程文件。该文件包含指向HT
jQuery.load('https://someurl.com .someClass')
。进行加载的页面位于HTTPS上;远程页面可作为HTTP和HTTPS使用。在合理的浏览器中,一切都可以正常工作,但IE发出了一个混合的HTTP/HTTPS内容安全警告——远程页面的HTTP链接中包含CSS和JS,即使请求为HTTPS。关于如何在IE中成功拉入混合内容文件而不触发警告,有什么线索吗?修改远程页面不是一个选项
编辑
要明确的是,我正在尝试通过HTTPS加载远程文件。该文件包含指向HTTP资源(img、css、js)的链接;因为我为
.load()
提供了一个选择器,所以合理的浏览器不会尝试解析和执行文档;IE确实如此。如果安全页面加载任何不安全的资源,它将抛出警告。绕过它的唯一方法是从https加载所有内容
即使是其他浏览器也应该在某处显示警告(可能在FF地址的左侧?你无法绕过IE中的混合内容警告。如果远程资源通过HTTP和HTTPS都可用,你可以确保你的协议匹配
jQuery.load(location.protocol+'//someurl.com.someClass'))
根据远程页面中混合内容的问题进行更新:
jQuery.load
在拉出选择器指示的相应部分之前,将整个responseText加载到documentFragment中(请参阅)。整个远程页面被解析为HTML,必须经过浏览器的安全过程;在许多方面,通过确保所有协议都匹配和/或仅返回一个片段(如果您只需要)来确保响应“干净”更简单
如果您不修改其他资源(这将更加健壮),那么您需要在远程资源仍然只是字符串的情况下,将所有出现的HTTP替换为HTTPS(反之亦然)。以下是一个脆弱的jQuery插件作为这项技术的一个示例,主要来自:
(函数($){
var http=“http:”,
https=“https:”,
rscript=/我认为没有办法绕过警告。您可能必须重写内联URL…如果您想确保资源是从同一协议加载的,那么可以指定“//domain.com/path/to/resource.js”作为路径,例如
。如果您使用https,则浏览器将尝试从https://domain.com
。该资源以HTTP和HTTPS的形式提供,我通过HTTPS加载它。尽管我为.load()提供了一个选择器,这将阻止浏览器实际解析文档并加载和执行链接的JS和CSS,IE似乎至少在解析文档并查看HTTP links.Protocol相对URL(“//example.com/example.JS”
)让IE7和IE8下载两次文件:Safari、Chrome和Firefox都正常工作,不会因为URL中添加了选择器而抛出错误——它们不会尝试解析整个文件。我敢打赌,它们不会抛出错误的唯一原因是因为它们的默认性质是不会抛出确认框,而eas IE是。我认为大多数不是IE的浏览器只是以另一种方式警告你。FF3在右下角显示了一个带感叹号的挂锁。如果它像IE一样抛出确认,那么在FF3中你很可能会遇到同样的问题。对不起,在非IE浏览器中,没有任何明显的迹象表明任何东西都不正常.
(function($){
var http = "http:",
https = "https:",
rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
proto = location.protocol,
otherProtoUri = new RegExp("\\b" + (proto === http ? https : http) + "(//[a-z\\d.-]+)", "gi");
$.fn.protocolModifyLoad = function(url, yesIKnowThisIsFragile, selector) {
var self = this;
if ( !this.length || !yesIKnowThisIsFragile) {
return this;
}
$.ajax({
url: url,
type: "GET",
dataType: "html",
complete: function( res, status ) {
// If successful, inject the HTML into all the matched elements
if ( status === "success" || status === "notmodified" ) {
// Force occurences of the other protocol into the current one
var response = res.responseText.replace(otherProtoUri, proto + "$1");
// See if a selector was specified
self.html( selector ?
// Create a dummy div to hold the results
jQuery("<div>")
// inject the contents of the document in, removing the scripts
// to avoid any 'Permission Denied' errors in IE
.append(response.replace(rscript, ""))
// Locate the specified elements
.find(selector) :
// If not, just inject the full result
response);
}
}
});
return this;
};
})(jQuery);