假设我从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/
答案 0 :(得分:138)
跨领域完全是一个不同的主题。但跨子域相对容易。您需要做的就是在父页面和iframe页面中将document.domain设置为相同。
document.domain = "yourdomain.com"
注意:这项技术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