跨域
协议,域名,端口都必须相同,才算在同一个域
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,重启浏览器即可