如何阻止jQuery自动将HTTP请求转为HTTPS?已开启混合内容允许
解决jQuery自动将HTTP请求转为HTTPS的问题
我之前也碰到过一模一样的情况——在HTTPS页面用jQuery的$.getJSON()或$.get()请求HTTP资源时,框架自动把协议转成HTTPS导致连接失败,哪怕已经手动开启了混合内容允许。下面是几个亲测有效的解决办法:
方法一:改用原生XMLHttpRequest
jQuery的AJAX方法可能内置了协议升级的安全逻辑(尤其是较新的版本),但原生的XMLHttpRequest不会自作主张修改请求协议。只要浏览器允许混合内容,这个方法能直接绕过问题:
const xhr = new XMLHttpRequest(); xhr.open('GET', 'http://host.com:1234/stats', true); xhr.onload = function() { if (this.status >= 200 && this.status < 300) { // 解析返回的JSON数据 const statsData = JSON.parse(this.responseText); // 这里编写你的数据处理逻辑 console.log('获取到数据:', statsData); } else { console.error('请求失败,状态码:', this.status); } }; xhr.onerror = function() { console.error('网络连接错误,无法访问目标地址'); }; xhr.send();
方法二:用jQuery的ajaxPrefilter强制保留HTTP协议
如果你不想放弃jQuery的便捷性,可以通过全局拦截AJAX请求,手动修正URL的协议,阻止jQuery自动升级:
// 全局拦截AJAX请求,针对特定地址强制使用HTTP $.ajaxPrefilter(function(options) { // 匹配你的目标HTTP地址前缀 const targetDomain = 'http://host.com:1234'; if (options.url.startsWith(targetDomain)) { // 确保URL始终是HTTP,替换可能被修改的HTTPS前缀 options.url = options.url.replace(/^https:/, 'http:'); // 开启跨域支持(如果目标地址和当前页面域名不同) options.crossDomain = true; } }); // 之后正常使用jQuery的AJAX方法即可 $.getJSON('http://host.com:1234/stats') .done(function(data) { console.log('请求成功:', data); }) .fail(function(error) { console.error('请求失败:', error); });
额外排查点
如果上面的方法还是不行,建议检查:
- 浏览器是否真的启用了混合内容允许:有些浏览器需要手动点击地址栏的警告图标,确认允许加载不安全内容
- 当前页面是否有
Content-Security-Policy(CSP)限制:查看浏览器控制台的CSP相关报错,如果是你自己的网站,可以调整CSP规则放宽限制
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

