【发布时间】:2015-03-21 04:54:12
【问题描述】:
我遇到了 CORS、HTTPS 和 POST 请求的问题,无法摆脱。
我的设置:
- 我有一个在 HTTPS 协议上运行的网络应用程序
- 我需要向不同域上的 API 发出 POST 请求(启用 CORS 的 Sailsjs)
- API 设置为接受 HTTP 和 HTTPS 请求 (nginx)
问题:
- 如果我使用 HTTPS 协议,在桌面上一切正常。如果我调用 HTTP,我会收到错误:"Blocked loading mixed active content"
- 在移动设备上,我花了几天时间尝试进行 HTTPS 调用,我尝试了数百种方法,但都没有成功。 HTTP 调用工作正常,但同样不能使用 HTTPS 到 HTTP。
所以基本上,在桌面上一切都很好,而一切都在 https 上。在手机上是不行的。当切换到 http 目标时,由于混合来源,一切都会刹车。
更多详情
webapp 正在使用 Angular,它在所有平台上都可以毫无问题地发出 CORS POST HTTPS 请求。
我试图做的一小部分是使用 vanilla xhr 请求:
submit: function(data){
var request = this.createCORSRequest("POST",'https://heregoesthedomain.com');
if (request){
request.onload = function() {
// Success code goes here.
console.log('success');
};
request.onerror = function() {
// Error code goes here.
console.log('error');
};
request.send(JSON.stringify(data));
}
},
createCORSRequest: function(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// Most browsers.
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// IE8 & IE9
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// CORS not supported.
xhr = null;
}
return xhr;
}
Angular 似乎在所有平台上都可以从 HTTPS 到 HTTPS 从域到域发出发布请求,而我似乎无法让它在干净的 JS 中工作。我不能使用 Angular 脚本,因为我需要在 Angular 初始化之前进行这些调用。
更新 1
为了清楚起见,我在尝试了 5 分钟后没有发布这个问题。我做过各种调试,我使用远程控制台进行移动浏览器调试等。
如果您要求提供错误消息,则根本没有。请求返回 status:0 并且所有其他 XMLHttp 值都是空的。我已经阅读了其中一个规范,当请求是从不再活动/不存在的源中生成时,请求有时会被阻止,但这不是我的情况。只需停留在同一个静态页面上。
【问题讨论】:
-
“不能让它工作”相当模糊。查看浏览器的开发者工具。查看 JavaScript 控制台。它是否报告任何错误?查看“网络”选项卡。是否正在提出请求?它得到回应了吗?它们是否包含您期望的数据?将您现在发出的请求与您使用 Angular 发出的请求进行比较。他们有什么不同?
-
@Quentin 很抱歉,我想我没有足够强调我已经在这方面浪费了多少时间和精力。你提到的每件事我当然已经做了一千条关系,而且还在做。分析错误、移动浏览器的远程控制台等尝试了一切 - 没有成功。
-
我知道你在从 https 到 http 时总是会遇到这个错误。这就是为什么 Netflix 在 http 中播放电影但在后面调用 https 的原因。
-
您尝试使用“vanilla”JavaScript 而非依赖 Angular 内置的方法来发出此特定请求的任何具体原因?
-
@Tom 你在使用角度路由吗?难道是角度路由改变了 url 状态(当你的 ajax 调用正在运行时)并且被视为不再处于活动状态的源?
标签: javascript angularjs nginx cors sails.js