101

我的网站使用 http 和 https 协议;它不影响内容。我的站点使用 jQuery ajax 调用,它也填充了页面上的某些区域。

现在,我想通过 https 进行所有 ajax 调用。(请不要问我为什么:))当我在使用 https 协议的页面上时,ajax 请求正在工作。当我在使用 http 协议的页面上时,我收到一个 javascript 错误:访问受限 URI 被拒绝

我知道这是一个跨域问题(实际上是一个跨协议问题),我知道我应该在 ajax 调用中使用与当前页面相同的协议。

不过,我希望所有 ajax 调用都是 https,并在通过 http 提供的页面上调用它们。是否有任何解决方法可以实现这一点(一些 json/代理解决方案?),还是根本不可能?

4

6 回答 6

58

从服务器添加 Access-Control-Allow-Origin 标头

Access-Control-Allow-Origin: https://www.mysite.com

http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

于 2011-05-10T17:04:44.807 回答
11

试试 JSONP。

大多数 JS 库使其与其他 AJAX 调用一样简单,但在内部使用 iframe 进行查询。

如果您不使用 JSON 作为有效负载,那么您必须在 iframe 周围滚动您自己的机制。

就个人而言,我只是将 http:// 页面重定向到 https:// 页面

于 2009-07-09T19:58:00.070 回答
9

http://example.com/可能会解析为与https://example.com/不同的 VirtualHost (由于未发送 Host 标头,因此会响应该 IP 的默认值),因此两者被视为单独的域,因此受到跨域 JS 限制。

JSON 回调可以让您避免这种情况。

于 2009-07-09T19:24:51.353 回答
4

查看开源 Forge 项目。它提供了一个 JavaScript TLS 实现,以及一些用于处理实际跨域请求的 Flash:

http://github.com/digitalbazaar/forge/blob/master/README

简而言之,Forge 将使您能够从通过 http 加载的网页向 https 站点发出 XmlHttpRequest。您需要通过服务器提供 Flash 跨域策略文件以启用跨域请求。查看自述文件末尾的博客文章,以更深入地了解其工作原理。

但是,我应该提到 Forge 更适合两个不同 https 域之间的请求。原因是存在潜在的 MiTM 攻击。如果您从不安全的站点加载 JavaScript 和 Flash,它可能会受到威胁。最安全的用途是从安全站点加载它,然后使用它来访问其他站点(安全或其他)。

于 2010-07-22T20:11:05.887 回答
2

您可以尝试在 iframe 中加载 https 页面,并通过某个桥将所有 ajax 请求路由进/出框架,这是一种解决方法,但它可能会起作用(不确定它是否会在安全上下文中施加相同的访问限制) . 否则,用于重新路由请求(如任何跨域调用)的本地 http 代理将是公认的解决方案。

于 2009-07-09T19:22:09.910 回答
2

这就是我所做的:

使用您要发布的数据生成一个隐藏的 iFrame。由于您仍然控制该 iFrame,因此不适用相同的来源。然后将该 iFrame 中的表单提交到 ssl 页面。然后 ssl 页面重定向到带有状态消息的非 ssl 页面。您可以访问 iFrame。

于 2011-09-12T13:51:57.110 回答