这里的跨域实质上是由浏览器同源策略限制的一类请求场景,浏览器同源策略SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。这里测试下通过Access-Control-Allow-Origin实现不同域名之间的访问,Access-Control-Allow-Origin 响应头指定了该响应的资源是否被允许与给定的orgin共享。

  语法 :

  Access-Control-Allow-Origin: *
       Access-Control-Allow-Origin: <origin>

  *
  对于不需具备凭证(credentials)的请求,服务器会以“*”作为通配符,从而允许所有域都具有访问资源的权限。
  <origin>
  指定一个可以访问资源的URI。

  这里使用四个域名,分别是:本机localhost、shop.com、blog.com、oa.com,在localhost、shop.com、blog.com上都创建一个test.html,在oa.com上创建ajax.php文件。

  test.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax跨域</title>
</head>
<body>
<!-- 创建一个按钮并绑定单击事件 -->
<input type="button" value="走你" onclick="show()">
<!-- 创建一个空ul -->
<ul></ul>
<script type="text/javascript">
function show() {
// 创建xhr对象
var xhr = new XMLHttpRequest();
// 监听请求状态
xhr.onreadystatechange = function() {
if (this.readyState == 4) {
// 当请求状态变为4时获取响应内容并放入ul
document.getElementsByTagName('ul')[0].innerHTML = this.responseText;
}
}
// 以get方式请求ajax.php
xhr.open('get', 'http://oa.com/ajax.php', true);
// 发送请求
xhr.send(null);
}
</script>
</body>
</html>

1、允许单个域名访问

ajax.php代码如下:

// 允许单个域名localhost访问
header('Access-Control-Allow-Origin: http://localhost');
echo '<h1>这是oa.com上的响应</h1>';
foreach ($_SERVER as $key => $value) {
echo '<li>',$key,'=>',$value,'</li><br>';
}

通过loclhost的test.html访问如下:

通过shop.com、blog.com访问如下:

2、允许多个域名访问

  ajax.php代码如下:

//获取要跨域访问的请求源
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';
//定义允许跨域访问的请求源
$allow_origin = array('http://localhost', 'http://shop.com');
//如果请求源在允许列表中就设置允许访问
if (in_array($origin, $allow_origin)) {
header('Access-Control-Allow-Origin:' . $origin);
}
echo '<h1>这是oa.com上的响应</h1>';
foreach ($_SERVER as $key => $value) {
echo '<li>',$key,'=>',$value,'</li><br>';
}

PS:$_SERVER['HTTP_ORIGIN'] 字段只有跨域访问时都会存在

通过loclhost的test.html访问如下:

通过shop.com的test.html访问如下:

通过blog.com的test.html访问如下:

因为blog.com不在被允许访问的数组中,所以仍然不能访问,此处通过定义数组单元实现多个域名的跨域访问。

2、允许所有域名访问

     ajax.php代码如下:

//通过通配符*允许所有域名访问
header('Access-Control-Allow-Origin: *');
echo '<h1>这是oa.com上的响应</h1>';
foreach ($_SERVER as $key => $value) {
echo '<li>',$key,'=>',$value,'</li><br>';
}

通过localhost的test.html访问如下:

通过shop.com的test.html访问如下:

通过blog.com的test.html访问如下:

以上就是PHP通过AJAXAccess-Control-Allow-Origin响应头实现跨域访问的方法。

PHP通过AJAX及Access-Control-Allow-Origin实现跨域访问的更多相关文章

  1. Access control allow origin 简单请求和复杂请求

    原文地址:http://blog.csdn.net/wangjun5159/article/details/49096445 错误信息: XMLHttpRequest cannot load http ...

  2. ajax 设置Access-Control-Allow-Origin实现跨域访问

    ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 即使使用jquery的jsonp方法,t ...

  3. ajax实现跨域访问

    ajax跨域访问是一个老生畅谈的问题啦,网上解决方法很多,discuz用的p3p协议,有兴趣的朋友可以了解下,比较常用的是JSONP方法,貌似目前这种方法只支持GET方式,不如POST方式安全. 即使 ...

  4. ajax 跨域访问 :Access-Control-Allow-Origin

    一说到ajax跨域.首先想到的就是jsonp  . JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 即使使用jQuery的jsonp方法,type设为POST,也 ...

  5. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

  6. 基于CAS的SSO单点登录-实现ajax跨域访问的自动登录(也相当于超时重连)

    先补课,以下网址可以把CAS环境搭起来. [JA-SIG CAS服务环境搭建]http://linliangyi2007.iteye.com/blog/165307 [JA-SIG CAS业务架构介绍 ...

  7. ajax设置Access-Control-Allow-Origin实现跨域访问

    ajax跨域访问 1.jsonp方法,jsonp方法是一种非官方方法,这种方法只支持GET方式, 不如POST方式安全.(即使使用jquery的jsonp方法,type设为POST, 也会自动变为GE ...

  8. 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示

    随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是 ...

  9. Ajax跨域访问问题-方法大全

    Case I. Web代理的方式 (on Server A) 即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果.此方案可以解决 ...

随机推荐

  1. dc

    http://www.cnblogs.com/yjmyzz/p/docker-install-tutorial.html https://segmentfault.com/a/119000000510 ...

  2. 读书笔记--C陷阱与缺陷(七)

    第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一 ...

  3. 洛谷P2024食物链

    传送门啦 这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种. 比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种.那么甲一 ...

  4. 洛谷P2149 Elaxia的路线

    传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...

  5. HDU 1068 Girls and Boys(最大独立集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 题目大意:有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该集合 ...

  6. CentOS 7 安装Docker CE

    本节内容: 背景 Moby项目 安装Docker CE 卸载Docker CE 一.背景 在搭建Registry的过程中,发现使用Docker 1.12版本,在push镜像到Registry时会报错误 ...

  7. 32 从1到n整数中1出现的次数

    输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 主要思路:设定整数点(如1.10.100等等)作为位置点i(对应n的各位.十位.百位等等),分别对每个数位上有多少包含1的点进行分析 ...

  8. CRLF LF CR

    The Carriage Return (CR) character (0x0D, \r) moves the cursor to the beginning of the line without ...

  9. day1作业:编写登陆接口

    作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 思路:要求是编写登陆接口,那么要有一个存放用户信息的模块:三次后锁定,要有一个存放锁定用户信息的模块:我们知 ...

  10. Web前端开发最佳实践系列文章汇总

    Web前端开发最佳实践(1):前端开发概述 Web前端开发最佳实践(2):前端代码重构 Web前端开发最佳实践(3):前端代码和资源的压缩与合并 Web前端开发最佳实践(4):在页面中添加必要的met ...