我的网站使用http和https协议;它不会影响内容。我的网站使用jQuery ajax调用,它也会填充页面上的某些区域。
现在,我想通过https进行所有ajax调用。 (请不要问我为什么:)) 当我在使用https协议的页面上时,ajax请求正在运行。 当我在使用http协议的页面上时,我收到一个javascript错误: 访问受限制的URI被拒绝
我知道这是一个跨域问题(事实上,它是一个交叉协议问题),我知道我应该在ajax调用中使用与当前页面相同的协议。
尽管如此,我希望所有ajax调用都是https,并在通过http提供的页面上调用它们。 是否有任何解决方法来实现这一点(某些json /代理解决方案?),还是根本不可能?
答案 0 :(得分:56)
从服务器添加Access-Control-Allow-Origin标头
Access-Control-Allow-Origin: https://www.mysite.com
答案 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。