17

我有一个站点 foo.com,它向 bar.foo.com 发出 ajax 请求。这行得通吗。

另外,如果 foo 是安全连接 https,bar.foo.com 也需要是 https 吗?这两个站点可以使用不同的证书吗?

4

5 回答 5

21

使用纯 http AJAX:您正在谈论跨域 XMLHttpRequest,这是浏览器不允许的。有一个W3C 提案等待在未来以安全的方式实现这一点(部分由 IE8、IIRC 实现),但目前绝对不可能。

但是,有一些解决方法可以安全地执行此操作:子空间(使用 iframe 和document.domain)、片段标识符技术(再次使用 iframe)和window.name技术(再次使用 iframe!)。

就 SSL 而言,您可以为域和子域购买单独的证书,或者购买涵盖两者的单个通配符 (*.foo.com) 证书(自然,通配符证书会更贵)。

如果您有一个从其他域请求项目的 HTTPS 页面,那么只要一切都是 HTTPS,一切都会好起来的。这意味着如果您使用其中一种 iframe 解决方法,则必须在 iframe 的属性中指定https://方案 URL 。src

最后一个效率较低的解决方法是在https://foo.com代理请求上设置一个脚本以不安全http://bar.foo.com。(这也解决了 XHR 跨域问题,因此您可以忽略其他解决方法。)当然,这意味着您将 XHR 请求发送到https://foo.com/someurl,然后点击http://bar.foo.com/someurl,接收响应并将其发送回浏览器,所以性能方面,如果你有这个选项,你最好将 bar.foo.com 的服务器端功能移到 foo.com 上。但是如果你不能移动服务器脚本,那么代理就是要走的路。

编辑:在做了一些额外的测试并获得 iframe AJAX 解决方法(#fragmentidentifier 之一)以跨不同的 HTTPS 域工作后,我更改了最后 3 个 grafs。您可以使用 iframe 进行 SSL 跨域 AJAX,只要一切正常https并且https在 iframe 中使用了该方案src。总结:

  1. 简短回答:不,不允许真正的跨域 XHR
  2. 使用 iframe 的解决方法:更高效,需要 2 个 SSL 证书(或通配符证书),有点复杂
  3. 使用代理的解决方法:效率较低,可以使用 1 个或 2 个 SSL 证书(1 个通过 http 对 bar.foo.com 的后端请求),有点复杂
于 2008-10-23T21:57:06.290 回答
0

大多数浏览器会根据它们的安全/隐私设置阻止任何外部调用 - 并且只允许对同一域进行 AJAX 调用。甚至子域也被阻止,因为在共享环境中它们可能构成真正的威胁。

简而言之:只通过同一个域进行 AJAX 调用(也许调用一个页面,然后从另一个域调用另一个页面 - 通过 curl/fopen/...),否则你会遇到麻烦。这也回答了您的 SSL 问题 - 无论您使用什么 SSL,或者它们是否相同 - 呼叫都会被阻止,尽管有 SSL。

于 2008-10-23T20:58:43.507 回答
0

是的,您可以获得两个域的不同证书。这完全取决于您决定如何配置它。

您可以为 foo.com 配置 Web 服务器,您可以为非安全打开端口 80,为安全打开端口 443 并同时使用两者。

您可以为 bar.foo.com 配置不同的 Web 服务器并执行相同的端口配置。

如果您需要确保两者都安全,那么您需要为每个不同的域获取证书。

您也许可以购买 *.foo.com 证书,使您能够将一个证书复制到另一个站点并使用它。

无论您的请求是否链接到http://bar.foo.com,您都不会获得安全连接。

你必须有 http"s" 告诉网络服务器使用端口 443 并尝试验证证书。

所有证书真正做的是说来源是可信的。即使它不受信任并且您确实使用了 http"s" 并且浏览器上有锁,您的数据无论如何都会被加密。

于 2008-10-23T21:02:35.277 回答
0

您可以结合 JavaScript TLS 和 Flash 来完成安全的跨域请求。通过这种方式,您的访问者可以访问https://foo.com,您可以将 XmlHttpRequests 发送到https://bar.foo.com。你可以用普通的 http 做同样的事情。

您需要为 foo.com 购买访问者的浏览器信任的 SSL 证书,但您可以为 bar.foo.com、bar2.foo.com 等生成自己的 SSL 证书。生成自己的更昂贵的替代方案SSL 证书(免费)是为 *.foo.com 购买通配符 SSL 证书。但是,如果您只是通过 foo.com 对这些站点进行跨域请求,那么您就不需要花费额外的现金。

查看 github 上的开源 Forge 项目:

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

最后的博客链接提供了更深入的解释。

于 2010-07-22T17:25:53.210 回答
0

是的,您当然可以进行跨域 ajax 提交。我们使用ssl.com 通配符证书进行了完全相同的设置,但您可以在 2 个站点上使用 2 个标准证书。

基本上你会使用 JSONP(yahoo、google、fb 等使用这个)。返回值被包装在一个函数中,amd 看起来像

someFunction("{...}");
于 2013-02-11T16:14:46.903 回答