关于跨域(子域)ajax请求的问题
假设我从http://www.example.com/index.html加载了主页面。 在那个页面上有一个js代码,它向http://n1.example.com//echo?message=hello发出ajax请求。 当收到响应时,主页面上的div用响应主体进行更新。
这将在所有stream行的浏览器上运行吗?
编辑:
显而易见的解决scheme是在www.example.com和n1.example.com前放置一个代理,并将其设置为使得每个到http://www.example.com/n1的子资源的请求被代理为http: //n1.example.com/ 。
跨域是完全不同的主题。 但跨子域相对容易。 所有你需要做的就是设置document.domain在父页面和iframe页面都是相同的。
document.domain = "yourdomain.com"
更多信息在这里
另一种可能或可能不适合你的解决scheme是dynamic插入/删除DOM中指向目标域的脚本标记。 这将工作,如果目标返回JSON并支持callback。
函数处理结果:
<script type="text/javascript"> function foo(result) { alert( result ); } </script>
而不是做一个AJAX请求,你会dynamic地插入这样的东西:
<script type="text/javascript" src="http://n1.example.com/echo?callback=foo"></script>
所有的现代浏览器都支持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标头。 标题的值指示允许哪些源网站。 例如,对前一个请求的响应将包含以下内容:
Access-Control-Allow-Origin: http : //www.example-social-network.com
如果服务器不允许交叉源请求,则浏览器将向example-social-network.com页面发送错误,而不是online-personal-calendar.com响应。
要允许访问所有页面,服务器可以发送以下响应标题:
Access-Control-Allow-Origin:*
但是,这可能不适用于安全问题。
很好的解释在这里下面的维基页面。 http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
另一个解决方法是将ajax请求定向到您域中的php(例如)页面,并在该页面中向子域发出cURL请求。
新的想法:如果你想跨越子域(www.domain.com和sub.domain.com),你正在使用Apache。 事情可以变得更容易。 如果一个子域实际上是一个在public_html(sub.domain.com = http://www.domain.com/sub/。子目录,所以如果你有ajax.domain.com/?request=subject…你可以做这样的事情:www .domain.com / AJAX /?请求=受试者
对我来说就像是一种魅力,对于less数几个Ajax请求来说,没有愚蠢的黑客,代理或者难事。
我find的最简单的解决scheme是在你的子域上创build一个PHP,并使用完整path将原始函数文件包含在其中。
例:
http://www.domain.com/ajax/this_is_where_the_php_is_called.php
子域:
sub.domain.com
创build:sub.domain.com/I_need_the_function.php
在I_need_the_function.php里面只需使用一个include:
include_once( “/服务器/path/的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);
这个例子很简单,我可以做到。 您可能想要使用更好的格式化path。
我希望这可以帮助别人。 这里没什么杂乱的 – 而且你正在调用原始文件,所以任何编辑将适用于所有function。
我为跨子域编写了一个解决scheme,并且一直在为我的应用程序工作。 我使用iframe,并在两边设置document.domain =“domain.com”。 你可以在下面find我的解决scheme
https://github.com/emphaticsunshine/Cross-sub-domain-solution