跨域

协议,域名,端口都必须相同,才算在同一个域

ajax是否允许跨域?

     说明  是否允许通信
 http://www.a.com/a.php  http://www.a.com/a.php  同一个域名下   是
 http://www.a.com/aa/a.php  http://www.a.com/bb/b.php  同一域名下不同文件夹  是
 http://www.a.com:8000/a.php  http://www.a.com/b.php  同一个域名不同端口  否
 http://www.a.com/a.php  https://www.a.com/a.php  同一域名,不同协议  否
 http://www.a.com/a.php  http://170.32.82.74/b.php  域名和域名对应ip  否
 http://www.a.com/a.php  http://script.a.com/b.php  同一域名,不同二级域名  否
 http://www.a.com/a.php  http://a.com/b.php  二级域名和一级域名  否
 http://www.b.com/a.php  http://www.a.com/b.php  不同域名  否
 
解决方法(1):
在被请求的Response header中加入

header('Access-Control-Allow-Origin:*');

就可以实现ajax POST跨域访问

这是html5新增的一项标准功能

在服务器响应客户端的时候,带上Access-Control-Allow-Origin头信息,一个跨域请求就不会被浏览器的同源安全策略所阻止了

  • 如果设置 Access-Control-Allow-Origin:*,则允许所有域名的脚本访问该资源。
  • Access-Control-Allow-Origin:http://www.phpddt.com.com,允许特定的域名访问。

跨域解决后,如果还要操作Cookie,还得继续补增响应头:

header('Access-Control-Allow-Credentials:true');

需要将 XMLHttpRequest 对象的 withCredentials 属性设置为 true,JQuery1.5.1+ 就开始提供了相应的字段,使用方式如下:

$.ajax({
  url:"B.abc.com",
  xhrFields:{
  withCredentials:true
},
  crossDomain:true
});

设置 withCredentials 为 true 的请求中会包含 A.abc.com端的所有Cookie,这些Cookie仍然遵循同源策略,所以,你只能访问其中和 abc.com/B同根域的Cookie,而无法访问其他域的Cookie

Cross-Origin Resource Sharing,跨域资源共享,简称 CORS,可以作为一种跨域请求以及响应的解决方案

eg:需要设置多个域名允许访问

<?php  
$ret = array(  
    'name' => isset($_POST['name'])? $_POST['name'] : '',  
    'gender' => isset($_POST['gender'])? $_POST['gender'] : ''  
);  
  
header('content-type:application:json;charset=utf8');  
  
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';  
  
$allow_origin = array(  
    'http://www.client.com',  
    'http://www.client2.com'  
);  
  
if(in_array($origin, $allow_origin)){  
    header('Access-Control-Allow-Origin:'.$origin);   //指定其他域名访问
    header('Access-Control-Allow-Methods:POST');      //相应类型
    header('Access-Control-Allow-Headers:x-requested-with,content-type');  //响应头设置  
}  
  
echo json_encode($ret);  
?>  

 解决方法(2):

  跨域使用POST方式,可以使用创建一个隐藏的iframe来实现

 解决方法(3):

  JSONP方法,这种方法只支持GET方式

  ajax请求参数dataType:'JSONP'

附:

  禁用chrome本地安全策略,不用配服务器环境也能发起ajax请求:
  chrome 桌面快捷键 右键属性 在快捷方式标签下的“目标”框中加入 --disable-web-security,重启浏览器即可

原文地址:https://www.cnblogs.com/baby123/p/5336086.html