7

我有两个文件,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>

和 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. 为什么会这样,我该如何解决?

4

1 回答 1

12

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

跨域 AJAX 请求的现代首选机制是跨域资源共享,或“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 的浏览器中工作。

于 2013-03-28T18:18:15.860 回答