【问题标题】:POST CORS request to HTTPS domain running sailsjsPOST CORS 请求到运行sailsjs 的HTTPS 域
【发布时间】: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


【解决方案1】:

由于您的 API 可以使用这两种类型的方案,您可以使请求 URL 与页面的方案相匹配(使用无模式的 url)

this.createCORSRequest("POST",'//heregoesthedomain.com')

这应该可以解决

阻止加载混合的活动内容

问题。

【讨论】:

  • 当网站通过 HTTPS 提供服务时,这将只使用 HTTPS——如果 HTTPS CORS 请求由于某些尚未确定的原因而无法工作,那么这里没有任何结果。
  • @cbroe 两个陈述的问题都提到了 https 到 http 的失败,所以我想先解决这个问题,看看它是否能解决问题。
  • 他需要通过 HTTPS 发出请求(因为混合内容阻塞),而 that 在移动设备上是行不通的。无论他是通过在地址前加上 https:// 前缀来“显式”使用 HTTPS 还是仅使用 // 来“隐式”使用 HTTPS,都可能没有任何区别。
【解决方案2】:

同样在 IE8/IE9 上,您不能以正常方式执行任何 CORS 请求。您可以使用XDomain对其进行排序

我会说,对于网络浏览器,你会遇到混合内容的问题。唯一的解决方案是创建特殊路由,这样您就可以在 https 上进行 http 和其他调用。 如果你有 Netflix 看,他们会通过在 http 上播放电影来解决问题,因为电影块是通过 http 获取的,会话是通过 https 完成的

【讨论】:

  • 对不起,看不出这有什么帮助。我确实将 xdomain 用于旧的 IE 浏览器,但这无关紧要。我也知道 Netflix 的做法,但又无关紧要。我看不到为一个端点设置代理的点,我只是转储一些数据 - 特别是当我看到它是可能的(角度)时,只是看不到为什么我不能让它工作
  • 如果你认为有可能的话。根据我在具有 3800 个单元测试的大型 Angular 项目中的经验,我们将其排序为这样。每个浏览器都在执行相同的“阻止加载混合活动内容”,但有些浏览器仅将其放在控制台日志中,而其他浏览器则阻止了内容。
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2016-02-13
  • 2016-02-24
相关资源
最近更新 更多