从 HTTP 到 HTTPS 的跨域请求立即中止

Posted

技术标签:

【中文标题】从 HTTP 到 HTTPS 的跨域请求立即中止【英文标题】:Cross domain request from HTTP to HTTPS aborts immediately 【发布时间】:2012-07-26 06:33:02 【问题描述】:

我正在尝试从 HTTP 页面向 HTTPS 服务进行跨域 Web 服务调用。

我已经在服务器上设置了正确的 CORS 标头(它适用于 HTTP-HTTP 和 HTTPS-HTTPS)。

如果我将请求更改为 JSONp,它确实工作。

我在 Chrome 和 Firefox 中看到的是 HTTPS 请求从未发送,它立即中止,并且服务器永远不会看到该请求。

值得注意的是,预检OPTIONS 请求被中止(并且它没有到达服务器)。

我找不到任何来源可以解释这确实是不可能的(HTTP 到 HTTPS)并且更好:解释 为什么。我可以理解 HTTPS 到 HTTP 是不安全的,但其他方式应该没问题吧?这对我来说似乎很愚蠢,因为 JSONp 有效(但它很混乱)。

笔记

我还将withCredentials 设置为true,并且我正在发送一些自定义标题和自定义Content-Typeapplication/json

我正在使用常规 XMLHTTPRequest 并回退到 IE 的 JSONp

【问题讨论】:

你们有现场网站供我调查吗? 不,我没有,我在本地开发服务器上运行它。 【参考方案1】:

好的,我想通了。我用于 HTTPS 域的证书是自签名且未经验证的。将它添加到受信任的第三方机构列表中为我修复了它。

您可以通过 IE 在 Windows 7 中安装证书。这对我有用: http://productforums.google.com/forum/#!topic/chrome/bds-Ao9LigA%5B1-25%5D 由zacharysyoung 2/11/09发布 确保您以管理员身份运行 IE(9),否则即使安装正确,安装也会失败。

    打开 Internet Explorer (IE) 并导航到托管自签名证书的站点。 IE 应该显示一个页面警告,“此网站的安全证书存在问题。” 单击“继续访问此网站(不推荐)”链接。 页面加载后,查看地址栏的右侧。标有“证书错误”的红色/粉色按钮应该可见。点击 那个按钮。 将出现一个名为“不受信任的证书”的弹出窗口。单击弹出窗口底部的“查看证书”链接。 将出现另一个名为“证书”的弹出窗口。单击“安装证书...”按钮。 “证书导入向导”将启动。单击“下一步”按钮。 ** 对于 XP:选择“自动选择证书...”选项,然后单击“下一步”按钮。 ** 对于 Vista: 选择“将所有证书放入以下存储”选项,然后 单击“浏览”按钮。湾。单击“显示物理商店” 复选框。 C。展开“第三方根认证” Authorities 文件夹,然后选择“本地计算机”。点击“确定” 按钮。 d。单击“下一步”按钮。 这应该会显示“完成证书导入向导”对话框。单击“完成”按钮。 将出现“安全警告”弹出窗口。该警告通知您证书的来源实际上无法验证。你 应该知道证书来自哪里。如果这样做,请单击 “是”按钮安装证书。 将显示最后一个弹出窗口,通知您“导入成功”。单击“确定”按钮。 重新启动/打开 Chrome 并导航到相关站点。您不应该看到安全警告页面。

除此之外,我想我可能在 Chrome 中发现了一个错误。看: https://code.google.com/p/chromium/issues/detail?id=141839

【讨论】:

超级有帮助。对于其他人来说,如果 ssl 证书有问题,Firefox 将静默中止 OPTIONS 请求。我只是通过直接进入域并为我的本地自签名添加一个例外来修复它。之后 OPTIONS 请求工作得很好【参考方案2】:

设置easyXDM 之类的内容可能更容易。它上手相当快,并且会为您完成所有向后兼容性(一直到 IE6)。它可能不是您正在寻找的本土解决方案,但如果您想要快速跨域(您可以访问双方),它符合要求。

您总是可以编写自己的 iframe (postMessage) 界面,但为什么要重新发明***(如果您使用不同的子域,请不要忘记设置您的 document.domain)。

【讨论】:

我有一个有效的实现(JSONp)。但我想知道 为什么 Chrome 和 Firefox 并阻止 HTTP 到 HTTPS 请求。 easyXDM 看起来没有维护,不整洁,功能完全臃肿,它需要.. Flash?如果我想做上传或非常大的请求,iframe 后备可能会很有趣,但目前我没有这样的要求。我也不“着急”。 对于个别浏览器,协议对隐私和安全有很大影响。新浏览器确实有“Content-Security-Policy”,但不确定它是否是跨协议的。我可能已经急于提供解决方案,但community for easyXDM 仍然存在。我相信最后一次更改比一个月前还少(它非常稳定,不需要任何新功能)。至于 flash,当 postMessage 不是一个选项但它确实具有大型(过度杀伤)功能集时,它被用作后备。 我不确定您的市场到底是什么,但您也可以尝试CORS 和/或“Access-Control-Allow-Origin”。同样,这些实际上是针对跨域而不是跨协议的(但也许可以偷偷摸摸)。 我正在使用 CORS .. 我以为我提到过?什么是跨协议? HTTPS 转 HTTP 当然可以,但是 HTTP 转 HTTPS?

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

使用ajax请求遇到的跨域问题

HTTP中的跨域请求HTTP报文结构状态码

请求接口时跨域问题,前端解决方法

IE8可以从HTTP到HTTPS发布跨域请求吗?

Spring MVC 的跨域解决方案

SpringBoot(十三)CORS方式实现跨域