AJAX,子域和SSL

17 javascript subdomain ajax ssl

我有一个网站foo.com,它向bar.foo.com发出ajax请求.这会有用吗

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

joe*_*rdi 21

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

然而,安全地做到这一点有变通方法:子空间(使用iframe和document.domain),片段标识符技术(再次使用iframe)和window.name技术(再次,iframes!).

就SSL而言,您可以为域和子域购买单独的证书,或者为它们两者购买单个通配符(*.foo.com)证书(当然,通配符证书将更加昂贵).

如果您有一个请求来自其他域的项目的HTTPS页面,只要一切都是HTTPS,一切都会好的.这意味着如果您使用iframe解决方法之一,则必须在iframe https://src属性中指定方案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 one)以在不同的HTTPS域之间工作之后,我更改了最后3个grafs.你可以做使用I帧SSL跨域AJAX只要一切都httpshttps方案在iframe中使用src.总结:

  1. 简答:不,真正的跨域XHR是不允许的
  2. 使用iframe的解决方法:更高效,需要2个SSL证书(或通配符证书),有点复杂
  3. 使用代理的解决方法:效率较低,可以使用1或2个SSL证书(1个通过http向bar.foo.com发送后端请求),有点复杂


Moj*_*jah 0

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

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