Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';t设置document.domain工作以允许对父域的AJAX请求?_Javascript_Ajax_Cross Domain - Fatal编程技术网

Javascript 为什么';t设置document.domain工作以允许对父域的AJAX请求?

Javascript 为什么';t设置document.domain工作以允许对父域的AJAX请求?,javascript,ajax,cross-domain,Javascript,Ajax,Cross Domain,我有两个文件,domain.com/test2.php: <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> <script&

我有两个文件,domain.com/test2.php:

<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>
<script>document.domain = "domain.com";</script>

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

document.domain机制旨在允许帧之间的客户端通信,而不是客户端到服务器的通信。如果一个框架包含来自
example.com
的页面,另一个框架包含来自
foo.example.com
的页面,那么这两个框架将无法访问彼此的DOM,除非后者将
document.domain
设置为
example.com

跨域AJAX请求的现代首选机制是CORS。此机制涉及让目标资源返回一个特殊的HTTP响应头,该头指示允许跨域请求。在您的场景中,您将使
test3.php
返回以下HTTP响应头:

Access-Control-Allow-Origin: sub.domain.com
Access-Control-Allow-Headers: X-Requested-With
在PHP中,您可以按如下方式执行此操作:

header("Access-Control-Allow-Origin: sub.domain.com");
您还可以将此标头值设置为just
*
,以便允许来自任何来源的跨域请求,但请注意,这将允许来自您不控制的站点的请求

来自客户端JavaScript库的请求通常还包括附加头
X-Requested-With
,该头不在CORS允许的标准集中,因此可能需要通过附加响应头显式允许此头:

Access-Control-Allow-Origin: sub.domain.com
Access-Control-Allow-Headers: X-Requested-With

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

您能在网络登录开发者工具中看到对您子域的请求吗?它看起来是否成功并返回了您期望的响应?@MartinAtkins请求显示为红色,状态为“(已取消)”。是的。设置为*意味着任何域都可以从中加载数据。哦,是的。。。我在回答中加了这个。谢谢。当我尝试此操作时,我收到一个500内部服务器错误:
内部服务器错误服务器遇到内部错误或配置错误,无法完成您的请求。此外,尝试使用ErrorDocument处理请求时遇到404 Not Found错误。
服务器的错误日志中是否有任何有用的信息可以帮助解释发生的情况?@MartinAtkins以下内容显示在apachelogs中:脚本的格式错误头。Bad header=访问控制允许来源:test2.php