一个关于跨域(子域)ajax请求的问题

IT技术 javascript ajax
2021-02-21 18:07:42

假设我从http://www.example.com/index.html加载了主页在该页面上有向http://n1.example.com//echo?message=hello发出 ajax 请求的 js 代码当收到响应时,主页上的 div 将更新为响应正文。

这是否适用于所有流行的浏览器?

编辑:

显而易见的解决方案是在 www.example.com 和 n1.example.com 前面放置一个代理并设置它,以便每个去http://www.example.com/n1子资源的请求都被代理到http: //n1.example.com/

6个回答

跨域是完全不同的主题。但是跨子域相对容易。您需要做的就是在父页面和 iframe 页面中将 document.domain 设置为相同。

document.domain = "yourdomain.com"

更多信息在这里

注:此方法只能让你互动与I帧从您的域的父母它并没有改变由XMLHttpRequest的发送起源。

不用担心,它仍然被评为最高并且很容易找到。stackoverflow 很棒。
2021-05-04 18:07:42
也许我很困惑,但他没有提到有关 iframe 的任何内容。这会影响答案的有效性吗?换句话说,在没有 iframe 的情况下,您是否可以使用此方法,也许我们正在谈论用作 RESTful api 的子域?(跨浏览器)
2021-05-05 18:07:42
太糟糕了,另一个“正确”的答案被选择了。这是问题的正确答案。共享二级域的域(有一些小例外)始终可以设置其域以允许在共享子域的其他域之间进行更广泛的访问。
2021-05-06 18:07:42
我同意在这种情况下对 iframe 的解释具有误导性。但是将 document.domain 设置为指向基本域(去除子域)应该适用于跨域 AJAX 请求,IIRC。
2021-05-09 18:07:42

所有现代浏览器都支持 CORS,因此我们应该利用这一补充。

它适用于简单的握手技术,两个域通过发送/接收的 HTTP 标头相互信任。期待已久,因为同源策略对于避免 XSS 和其他恶意尝试是必要的。

要发起跨域请求,浏览器会发送带有 Origin HTTP 标头的请求。此标头的值是提供该页面的站点。例如,假设http://www.example-social-network.com上的页面尝试访问 online-personal-calendar.com 中的用户数据。如果用户的浏览器实现了 CORS,则会发送以下请求标头:

来源:http : //www.example-social-network.com

如果 online-personal-calendar.com 允许该请求,它会在其响应中发送一个 Access-Control-Allow-Origin 标头。标头的值指示允许哪些源站点。例如,对先前请求的响应将包含以下内容:

访问控制允许来源:http : //www.example-social-network.com

如果服务器不允许跨域请求,浏览器将向 example-social-network.com 页面而不是 online-personal-calendar.com 响应传递错误。

为了允许访问所有页面,服务器可以发送以下响应头:

访问控制允许来源:*

但是,这可能不适用于需要考虑安全性的情况。

在下面的维基页面中很好地解释了这里。 http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

IE 8 & 9 不完全支持 CORS。至少对于我的网站来说,这仍然是流量的重要组成部分。
2021-04-24 18:07:42
我想它适用于 IE9,可能是我错了,因为我一直在使用 jQuery CORS 插件来添加对 IE8+ 的支持。gist.github.com/mathieucarbou/1114981
2021-05-14 18:07:42

另一个可能适合您也可能不适合您的解决方案是在您的 DOM 中动态插入/删除指向目标域的脚本标签。如果目标返回 json 并支持回调,这将起作用。

处理结果的函数:

<script type="text/javascript">
  function foo(result) {
    alert( result );
  }
</script>

您可以动态插入如下内容,而不是执行 AJAX 请求:

<script type="text/javascript" src="http://n1.example.com/echo?callback=foo"></script>
这种技术称为 JSONP。主要的 JavaScript 框架在其 AJAX 库中都具有此功能。
2021-05-11 18:07:42

另一种解决方法是将 ajax 请求定向到您域上的 php(例如)页面,并在该页面中向子域发出 cURL 请求。

新想法:如果您想要跨子域(www.domain.com 和 sub.domain.com)并且您正在使用 apache。事情会变得容易很多。如果子域实际上是 public_html 中的子目录(sub.domain.com = www.domain.com/sub/。所以如果你有 ajax.domain.com/?request=subject...你可以做这样的事情:www .domain.com/ajax/?request=subject

对我来说就像一种魅力,并且没有愚蠢的黑客、代理或仅针对几个 Ajax 请求的困难的事情!