Ajax在http页面上使用https

时间:2009-07-09 19:18:13

标签: jquery ajax https cors

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

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

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

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

6 个答案:

答案 0 :(得分:56)

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

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

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

答案 1 :(得分:11)

尝试JSONP。

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

如果您没有将JSON用于有效负载,则必须围绕iframe推出自己的机制。

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

答案 2 :(得分:8)

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

JSON callbacks可以让你避免这种情况。

答案 3 :(得分:4)

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

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

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

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

答案 4 :(得分:2)

您可以尝试在iframe中加载https页面,并通过某个网桥将所有ajax请求路由到帧外,这是一个hackaround但它可能会起作用(不确定它是否会施加相同的访问限制)安全的背景)。否则,用于重新路由请求的本地http代理(如任何跨域调用)将是可接受的解决方案。

答案 5 :(得分:2)

这就是我的所作所为:

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