CORS - 从 HTTPS 跨域 POST 到 HTTP

Posted

技术标签:

【中文标题】CORS - 从 HTTPS 跨域 POST 到 HTTP【英文标题】:CORS - cross domain POST to HTTP from HTTPS 【发布时间】:2014-05-02 08:31:22 【问题描述】:

我正在尝试使用从 HTTPS 加载的页面到使用 HTTP url 的不同域的 XmlHTTPRequest POST。 HTTP 服务器是本地(家庭)服务器,因此它不能是 HTTPS。 (这是一个原型/演示 - 家庭 HTTP 服务器可能在机顶盒中)。我的服务器返回:

'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods' : 'GET, POST, PUT, DELETE, OPTIONS'

当我发布时,浏览器似乎取消了请求。我在控制台中看到了这个警告:

'https://xxx.html' 的页面通过 HTTPS 加载,但显示来自'http://localhost:10293/yyy' 的不安全内容:此内容也应通过 HTTPS 加载。

有没有办法让它工作?

非常有趣的是,我可以向 HTTP 服务器发送一个 DELETE,它可以工作,只是不能 POST! (服务器处理 'OPTION' 请求,并返回上面的 'Access' 标头。DELETE 也会导致警告吐出,但请求被发送,不像 POST,请求被浏览器取消。

服务器是一个基本的 node.js 服务器。

【问题讨论】:

您是否曾经能够从 https 端点向您的家庭 HTTP 服务器发送有效的 POST/GET 请求?我有同样的问题 【参考方案1】:

我能够通过在我的 HTTP 服务器中处理 OPTIONS 请求来完成这项工作:

    response.writeHead(200, 
        'Content-Type': 'text/html', 
        'Access-Control-Allow-Origin': '*', 
        'Access-Control-Allow-Methods' : 'GET, POST, PUT, DELETE, OPTIONS'
    );
    response.end();

只有 POST 失败的问题是一个红鲱鱼 - 我现在忘记了确切的情况,我上面的评论说了一些关于 POST 之后的 setTimeout 的内容。不确定,但它现在可以工作了。

【讨论】:

其实我刚刚重新测试过,最新版的Chrome浏览器是不允许的。我现在得到的错误是:混合内容:“zzzzzz”处的页面是通过 HTTPS 加载的,但请求了一个不安全的 XMLHttpRequest 端点“xxxxx”。此请求已被阻止;内容必须通过 HTTPS 提供。

以上是关于CORS - 从 HTTPS 跨域 POST 到 HTTP的主要内容,如果未能解决你的问题,请参考以下文章

带有 CORS 的跨域 POST 请求返回 access-control-allow-origin 丢失

前端ajax+cors+post跨域对于IE兼容性分析

post跨域请求剖析

是否可以在 IE 中进行从 https 到 http 的跨域请求?

跨域CORS原理及调用具体示例

WebApi开启CORS支持跨域POST