【问题标题】:Why doesn't setting document.domain work to allow AJAX requests to a parent domain?为什么设置 document.domain 不能允许 AJAX 请求到父域?
【发布时间】:2020-01-14 14:00:51
【问题描述】:

我有两个文件,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。为什么会这样?我该如何解决?

【问题讨论】:

  • 您能在开发者工具的网络日志中看到对您的子域的请求吗?它看起来是否成功并返回了您预期的响应?
  • @MartinAtkins 请求显示为红色,状态为“(已取消)”。

标签: javascript ajax cross-domain


【解决方案1】:

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

跨域 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 的浏览器中工作。

【讨论】:

  • 是的。设置为 * 意味着任何域都可以从中加载数据。
  • 哦,是的...我将此添加到我的答案中。谢谢。
  • 当我尝试这个时,我得到一个 500 内部服务器错误:Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
  • 服务器的错误日志中是否有任何有用的信息可以帮助解释发生了什么?
  • @MartinAtkins 以下出现在 apachelogs 中:来自脚本的格式错误的标头。 Bad header=Access-Control-Allow-Origin: test2.php
猜你喜欢
  • 1970-01-01
  • 2012-11-03
  • 2019-07-19
  • 2013-12-03
  • 2016-03-03
  • 2011-07-19
  • 2017-03-15
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多