JavaScript如何从父域名访问子域名?

18
我读到设置document.domain = "example.com"可以让我从子域名访问父域名。那反过来行不行呢?
假设我的主站在http://example.com运行。我想通过AJAX(GET和POST)访问的所有API功能都托管在http://api.example.com上。
我能从example.com访问api.example.com吗?
编辑:再次查看document.domain,我认为这不会解决问题。对api.example.com的调用结果可能不是HTML,而是在API服务器上运行的PHP脚本的输出。它可以是JSON、纯文本等,因此无法为其设置document.domain(因为它不是iframe)。

2
只需配置您的服务器,使得所有来自 api.example.com 的资源返回此 HTTP 头部:Access-control-allow-origin: http://example.com - Šime Vidas
它被称为跨域资源共享,简称CORS。 - mplungjan
1
只是提醒一下:CORS在跨浏览器方面还不完全支持,因此目前最好使用JSONP。 - Casey Chu
@Casey 是的,IE6和IE7。我希望OP不必支持它们... - Šime Vidas
1个回答

7
你需要在两个页面上都设置document.domain。
或者在你的服务器上设置CORS头。

http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/


CORS简介

Firefox 3.5和Safari 4实现了CORS规范,使用XMLHttpRequest作为“API容器”来代表Web开发人员发送和接收适当的标头,从而允许跨站点请求。IE8实现了CORS规范的一部分,使用XDomainRequest作为类似的“API容器”,使得简单的跨站点GET和POST请求成为可能。值得注意的是,这些浏览器会发送ORIGIN标头,该标头提供了正在进行跨站点请求的页面的协议(http://或https://)和域。服务器开发人员必须确保他们发送正确的标头,特别是对于所涉及的ORIGIN的Access-Control-Allow-Origin标头(如果资源是公共的,则为所有域名的“*”)。

CORS标准通过添加新的HTTP标头来允许服务器向允许的源域提供资源。浏览器支持这些标头并强制执行它们建立的限制。此外,对于可以对用户数据造成副作用的HTTP请求方法(特别是除GET之外的HTTP方法,或者使用某些MIME类型的POST用法),规范要求浏览器“预检”请求,通过HTTP OPTIONS请求标头向服务器请求支持的方法,然后在获得服务器的“批准”后,发送实际的请求和实际的HTTP请求方法。服务器还可以通知客户端是否应该发送“凭据”(包括Cookie和HTTP身份验证数据)。


1
如果api.example.com上的页面不是HTML页面,而是从PHP脚本返回的文本数据呢? - Mark
IE 8及以上版本也可以使用XDomainRequest() - Andy E
是的,可以看到文本:“IE8实现了CORS规范的一部分,使用XDomainRequest”。 - mplungjan
如果您选择CORS作为答案,那么您可能不支持IE7? - epascarello
实际上,我相信如果您将服务器网址添加到受信任站点中,IE7可能仍然会感到满意。 - mplungjan
应注意到的是,即使设置 credentials -> true,在IE8和IE9中仍然不会发送cookies。 - themihai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接