为什么不设置document.domain来允许AJAX请求到父域?

Edw*_*erd 6 javascript ajax cross-domain cors

我有两个文件,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>
Run Code Online (Sandbox Code Playgroud)

和domain.com/test3.php:

<b>var1: <?php echo $var1; ?> , var2: <?php echo $var2; ?></b>
Run Code Online (Sandbox Code Playgroud)

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

<script>document.domain = "domain.com";</script>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ins 11

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

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

Access-Control-Allow-Origin: sub.domain.com
Run Code Online (Sandbox Code Playgroud)

在PHP中,您可以按如下方式执行此操作:

header("Access-Control-Allow-Origin: sub.domain.com");
Run Code Online (Sandbox Code Playgroud)

您还可以将此标头值设置为仅*允许来自任何来源的跨域请求,但请注意,这将允许来自您无法控制的站点的请求.

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

Access-Control-Allow-Headers: X-Requested-With
Run Code Online (Sandbox Code Playgroud)

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