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

时间:2009-03-16 00:49:45

标签: javascript ajax

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

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

编辑:

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

7 个答案:

答案 0 :(得分:138)

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

document.domain = "yourdomain.com"

More info here

注意:这项技术will only let you interact with iframes from parents of your domain。它确实改变XMLHttpRequest发送的Origin。

答案 1 :(得分:18)

可能适用于您的另一个解决方案是在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>

答案 2 :(得分:18)

所有现代浏览器都支持CORS,从此我们应该利用这一新增功能。

它适用于简单的握手技术,即2个域通过发送/接收的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标头。标头的值指示允许的源站点。例如,对先前请求的响应将包含以下内容:

Access-Control-Allow-Origin:http://www.example-social-network.com

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

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

Access-Control-Allow-Origin:*

但是,这可能不适合担心安全问题的情况。

在wiki页面下面很好地解释了这一点。 http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

答案 3 :(得分:1)

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

答案 4 :(得分:1)

新想法:如果你想要跨子域(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 /?请求=受试者

对我来说就像一个魅力,对于一些Ajax请求,没有愚蠢的黑客,代理或难以处理的事情!

答案 5 :(得分:1)

我找到的最简单的解决方案是在子域上创建一个php,并使用完整路径将原始函数文件包含在其中。

示例:

  

www.domain.com/ajax/this_is_where_the_php_is_called.php

子域:

  

sub.domain.com

创建: sub.domain.com/I_need_the_function.php

  

在I_need_the_function.php中,只需使用include:

     

include_once( “/服务器/路径/的public_html / AJAX / this_is_where_the_php_is_called.php”);

现在从你的javascript调用sub.domain.com/I_need_the_function.php。

var sub="";
switch(window.location.hostname)
{
case "www.domain.com":
sub = "/ajax/this_is_where_the_php_is_called.php";
break;
case "domain.com":
sub = "";
break;
default: ///your subdomain (or add more "case" 's)
sub = "/I_need_the_function.php";
}


xmlHttp.open("GET",sub,true);

这个例子就像我能做到的那样简单。您可能希望使用更好的格式化路径。

我希望这会对某人有所帮助。这里没有任何杂乱 - 你正在调用原始文件,因此任何编辑都将适用于所有功能。

答案 6 :(得分:0)

我为跨子域编写了一个解决方案,它一直在为我的应用程序工作。我使用iframe并在两边设置document.domain =“domain.com”。您可以在以下网址找到我的解决方案:

https://github.com/emphaticsunshine/Cross-sub-domain-solution