【问题标题】:Ajax using https on an http page在 http 页面上使用 https 的 Ajax
【发布时间】:2010-11-09 12:11:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么不将ajax匹配到加载页面协议?
  • 他们特别说“请不要问我为什么。”
  • 为什么你需要 AJAX 和 HTTPS ......
  • 例如,对于一个更动态的结帐表单,它在后台连接到像 paypal 这样的支付网关,这样人们就可以看到正在发生的事情......只是更多可能性之一

标签: jquery ajax https cors


【解决方案1】:

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

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

【讨论】:

  • JSON 回调的死链接 :(
  • @Kubi 这个答案明天就有十年了,断开的链接是我们要求问题包含足够的信息来生存的原因。
  • 刚刚注意到这 10 年哈......是的,好点。没关系,如果我找到任何东西,我会到处搜索并编辑答案
【解决方案2】:

这是我的工作:

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

【讨论】:

  • 这可以做到,但是如果你需要来自 iFrame 的会话 cookie,请务必设置 P3P 标头...否则 MSE 会说“nu uh uh”
【解决方案3】:

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

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

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

【讨论】:

  • 很好的回应 - 但一些使用过的浏览器不支持,如 Opera(根本不)和 Internet Explorer(从版本 8 开始支持)caniuse.com/#search=cors
  • 似乎 Opera 现在支持它了:en.wikipedia.org/wiki/… 不过不是 Opera Mini...
【解决方案4】:

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

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

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

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

【讨论】:

    【解决方案5】:

    试试 JSONP。

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

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

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

    【讨论】:

    • 嗯,我已经尝试过设置了 jsonp:'jsonp_callback' 选项的 jquery .ajax,但仍然是同样的 js 错误。
    • 可能需要在URL中添加回调参数
    • @user135863 您发送查询的端点是否首先支持 JSONP?
    • 为了我的理智,我会选择你的最后一个选择...简单重定向到https:
    【解决方案6】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2010-11-04
    • 2011-01-07
    • 2016-10-17
    • 2016-11-23
    • 2018-06-20
    相关资源
    最近更新 更多