从父域到子域的 JavaScript 访问?

Posted

技术标签:

【中文标题】从父域到子域的 JavaScript 访问?【英文标题】:JavaScript access from parent domain to subdomain? 【发布时间】:2011-09-10 19:10:30 【问题描述】:

我读过设置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)。

【问题讨论】:

简单地配置你的服务器,让来自api.example.com的所有资源都返回这个HTTP头:Access-control-allow-origin: http://example.com 也就是Cross Origin Resource Sharing,简称CORS。 只是一个警告:CORS 还没有完全跨浏览器,所以你现在最好使用 JSONP。 @Casey 是的,IE6 和 IE7。我希望 OP 不必支持那些... 【参考方案1】:

您需要在两个页面上设置 document.domain

或者在您的服务器上设置 CORS 标头:

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

CORS 概览

Firefox 3.5 和 Safari 4 实现了 CORS 规范,使用 XMLHttpRequest 作为“API 容器” 发送和接收 代表适当的标题 网络开发人员,从而允许 跨站请求。 IE8 实现 CORS 规范的一部分,使用 XDomainRequest 作为类似的“API 容器”用于 CORS,实现简单 跨站点 GET 和 POST 请求。 值得注意的是,这些浏览器发送 ORIGIN 标头,它提供 方案(http:// 或 https://)和 正在制作的页面的域 跨站请求。服务器开发人员 必须确保他们发送 右头球回来了,尤其是 Access-Control-Allow-Origin 标头 有问题的 ORIGIN(或“*”表示 所有域,如果资源是 公开)。

CORS 标准通过添加新的 允许服务器的 HTTP 标头 将资源提供给允许的来源 域。浏览器支持这些 标头并执行限制 他们建立。此外,对于 HTTP 可能导致的请求方法 对用户数据的副作用(在 特别是对于其他 HTTP 方法 比 GET 或 POST 使用 某些 MIME 类型),规范 要求浏览器“预检” 请求,请求支持的方法 从带有 HTTP OPTIONS 的服务器 请求标头,然后,在 来自服务器的“批准”,发送 实际请求与实际 HTTP 请求方法。服务器也可以 通知客户是否“凭证” (包括 Cookie 和 HTTP 认证数据)应该被发送 有请求。

【讨论】:

如果 api.example.com 上的页面不是 HTML 页面,而是 PHP 脚本返回的文本数据怎么办? IE 8 及更高版本也可以使用XDomainRequest() 是的,见正文:“IE8实现了部分CORS规范,使用XDomainRequest” 如果您选择此作为 CORS 的答案,您是否不支持 IE7? 其实我相信如果你把服务器url添加到受信任的站点,IE7可能仍然会很高兴

以上是关于从父域到子域的 JavaScript 访问?的主要内容,如果未能解决你的问题,请参考以下文章

从子域到父域获取异常

子域 cookie,在父域请求中发送?

使子域读取父域会话

Dns 无法从不同注册器中的父域解析 Route 53 中的子域

htaccess Mod_Rewrite 从主域到子域

应用程序域