【发布时间】:2010-09-18 21:22:26
【问题描述】:
我有一个站点 foo.com,它向 bar.foo.com 发出 ajax 请求。这行得通吗?
另外,如果 foo 是安全连接 https,bar.foo.com 也需要是 https 吗?这两个网站可以使用不同的证书吗?
【问题讨论】:
标签: javascript ajax ssl subdomain
我有一个站点 foo.com,它向 bar.foo.com 发出 ajax 请求。这行得通吗?
另外,如果 foo 是安全连接 https,bar.foo.com 也需要是 https 吗?这两个网站可以使用不同的证书吗?
【问题讨论】:
标签: javascript ajax ssl subdomain
使用纯http AJAX:您正在谈论跨域XMLHttpRequest,这是浏览器不允许的。有一个W3C proposal pending 可以在未来以安全的方式实现这一点(部分由 IE8、IIRC 实现),但目前绝对不可能。
但是,有一些解决方法可以安全地执行此操作:Subspace(使用 iframe 和 document.domain)、fragment identifier technique(再次使用 iframe)和 window.name technique(再次使用 iframe!)。
就 SSL 而言,您可以为域和子域购买单独的证书,或者购买涵盖两者的单个通配符 (*.foo.com) 证书(当然,通配符证书会更贵)。
如果您有一个从其他域请求项目的 HTTPS 页面,那么只要一切都是 HTTPS,一切都会好起来的。这意味着,如果您使用其中一种 iframe 解决方法,则必须在 iframe 的 src 属性中指定 https:// 方案 URL。
最后一种效率较低的解决方法是在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 并且在 iframe src 中使用 https 方案。总结:
【讨论】:
大多数浏览器会根据其安全/隐私设置阻止任何外部调用 - 并且只允许对同一域进行 AJAX 调用。甚至子域也被阻止,因为在共享环境中它们可能构成真正的威胁。
简而言之:只通过同一个域进行 AJAX 调用(可能调用一个页面,然后调用另一个域的另一个页面 - 通过 curl/fopen/...),否则您会遇到麻烦。这也回答了您的 SSL 问题 - 无论您使用的是什么 SSL,或者它们是否相同 - 呼叫都会被阻止,尽管有 SSL。
【讨论】:
是的,您可以获得两个域的不同证书。这完全取决于您决定如何配置它。
您可以为 foo.com 配置一个网络服务器,您可以打开端口 80 用于非安全,打开端口 443 用于安全并同时使用两者。
您可以为 bar.foo.com 配置不同的 Web 服务器并进行相同的端口配置。
如果您需要确保两者都安全,那么您需要为每个不同的域获取证书。
您也许可以购买 *.foo.com 证书,使您能够将一个证书复制到另一个站点并使用它。
无论您的请求是否链接到http://bar.foo.com,您都不会获得安全连接。
你必须有 http"s" 告诉网络服务器使用端口 443 并尝试验证证书。
所有证书真正做的是说来源是可信的。 即使它不受信任并且您确实使用了 http"s" 并且浏览器上有锁,您的数据仍然会被加密。
【讨论】:
您可以结合使用 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
最后的博客链接提供了更深入的解释。
【讨论】:
是的,您当然可以进行跨域 ajax 提交。我们使用ssl.com wildcard cert 进行了完全相同的设置,但您可以在 2 个站点上使用 2 个标准证书。
基本上你会使用 JSONP(yahoo、google、fb 等都使用这个)。返回值被包装在一个函数中,看起来像
someFunction("{...}");
【讨论】: