2013-03-22 28 views
5

我有两个文件,domain.com/test2.php:为什么不设置document.domain工作以允许AJAX请求到父域?

<div id="testDiv"></div> 

<script src="http://domain.com/packages/jquery.js"></script> 
<script>$("#testDiv").load("http://domain.com/test3.php", {var1:1, var2:2});</script> 

和domain.com/test3.php:

<b>var1: <?php echo $var1; ?> , var2: <?php echo $var2; ?></b> 

在这种情况下domain.com/test2.php输出 var1: 1 , var2: 2正如人们所期望的那样,但现在让我们说我想在子域中创建一个test2.php。要停止与跨域脚本的问题,我想这额外的行添加到sub.domain.com/test2.php开始:

<script>document.domain = "domain.com";</script> 

这额外的行停止从显示出来的跨域错误,但现在该文件不再输出var1: 1 , var2: 2。为什么是这个,我该如何解决这个问题?

+1

你能看到的请求,你的子域在网络日志中的开发工具中显示吗?它看起来是否成功并返回了您预期的响应? – 2013-03-28 05:59:11

+0

@MartinAtkins请求以红色显示,状态为“(已取消)”。 – 2013-03-28 17:56:25

回答

10

document.domain机制的目的是用于允许帧之间的客户端通信,而不是客户机到服务器的通信。如果从example.com包含一个网页一个框架,并从foo.example.com包含页面另一个框架则二者不能互相访问对方的DOM,除非后者套document.domainexample.com,你在你的例子显示。

跨域AJAX请求现代化的优选机制是Cross-Origin Resource Sharing,或“CORS”。这种机制涉及让目标资源返回一个特殊的HTTP响应头,表明允许跨域请求。在你的情况下,你会做你的test3.php返回以下HTTP响应头:

Access-Control-Allow-Origin: sub.domain.com 

在PHP中,你可以这样做如下:

header("Access-Control-Allow-Origin: sub.domain.com"); 

还可以将此标头值设置为只*为了允许来自的任何来源的跨域请求,但请注意,这将允许来自您不受控制的网站的请求。从客户端

请求JavaScript库通常还包括附加的报头X-Requested-With不在由CORS允许的标准集,所以它可能有必要明确地允许该头经由附加响应头:

Access-Control-Allow-Headers: X-Requested-With 

CORS仅在现代浏览器中受支持。对于较老的浏览器,通用惯例是使用JSON-P,这是利用一个服务器上的页面能够从另一个服务器加载和执行脚本文件的技巧。这种技术要求目标资源是一个在页面中调用函数的有效JavaScript程序,因此它不像CORS那样优雅和无缝,但它应该可以在任何支持JavaScript的浏览器中使用。

+0

是的。设置为*表示任何域都可以从中加载数据。 – 2013-03-28 18:28:39

+0

哦,是的......我把这个添加到我的答案中。谢谢。 – 2013-03-28 18:45:56

+0

当我尝试这个时,我得到一个500内部服务器错误: '内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。 此外,尝试使用ErrorDocument来处理请求时遇到404未找到错误。“ – 2013-03-28 18:48:18