在host1与域http://domain1我使用ajax结构:
- index.php(即包含ajax)
- config.php (connect database)
- get_city.php
index.php
$(document).ready(function(){
$('.nation').change(function(){
var id = $(this).val();
var dataString = 'id='+id;
$.ajax({
type: 'POST',
url: '**http://domain1/get_data.php**',
data: dataString,
cache: false,
success: function(html) {
$('.city').html(html);
}
});
});
});
在get_city.php: <?php
include 'config.php';
$id = $_POST['id'];
if($id) {
$query = mysql_query("Select * From jos_city Where nation_id = id");
while($row = mysql_fetch_array($query)) {
$id = $row['id'];
$name = $row['city_name'];
echo '<option value="'.$id.'">'.$name.'</option>';
}
}
当我使用域名为http://domain2的其他主机时,ajax无法加载
$(document).ready(function(){
$('.nation').change(function(){
var id = $(this).val();
var dataString = 'id='+id;
$.ajax({
type: 'POST',
url: '**http://domain1/get_data.php**',
data: dataString,
cache: false,
success: function(html) {
$('.city').html(html);
}
});
});
});
我认为,错误发生在从domain1到domain2调用url: 'http://domain1/get_data.php'时。有人知道为什么会这样吗?
AJAX调用必须遵循同源策略,您不能对另一个域进行普通的AJAX调用。
但是,有一些变通方法:
为了使开发人员能够以可控的方式规避同源策略,许多"黑客",如使用片段标识符或
window.name
属性,已被用于在驻留在不同域的文档之间传递数据。有了HTML5标准,就有了一种正式的方法:postMessage
接口,它只在最近的浏览器上可用。JSONP和跨域资源共享也可以用来实现对其他域的类似ajax的调用。[2]为了支持旧的浏览器,JavaScript库easyXDM可以用来为
postMessage
接口提供一个统一的API,以及一些用于允许跨域消息传递(XDM)的hack。
另一种方式-
-
对另一个other_file.php文件(在同一域)进行AJAX调用
从another_file.php ;执行CURL请求到另一个域并获得响应
下面是一个简单的CURL示例
所有AJAX调用必须遵守同源规则。该规则阻止AJAX调用另一个域。
事实:
在计算中,同源策略是一个重要的安全概念对于许多浏览器端编程语言,例如JavaScript。该策略允许脚本在发起的页面上运行从同一站点访问彼此的方法和属性没有具体的限制,但阻止访问大多数方法和跨页面属性。这种机制对现代网络具有特殊的意义广泛依赖HTTP cookie来维护的应用程序通过身份验证的用户会话,因为服务器基于HTTP cookie进行操作信息泄露敏感信息或采取状态变化行动。严格区分所提供的无关内容必须在客户端维护站点,以防止数据丢失保密性或完整性
历史:
同源策略的概念可以追溯到Netscape Navigator2.0. 所有当前的浏览器都使用了原始设计的近似衍生物,并且经常扩展以定义大致兼容的安全性其他web脚本语言的边界,如Adobe Flash,或用于直接DOM操作以外的机制,例如XMLHttpRequest。
更多信息请参见维基百科。
另一种方法是使用AJAX调用PHP文件(在您的域上)。然后执行cURL调用。有关更多信息,请参阅PHP.net。这里有一个简单的例子