PHP通过AJAX及Access-Control-Allow-Origin实现跨域访问
这里的跨域实质上是由浏览器同源策略限制的一类请求场景,浏览器同源策略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通过AJAX及Access-Control-Allow-Origin响应头实现跨域访问的方法。
PHP通过AJAX及Access-Control-Allow-Origin实现跨域访问的更多相关文章
- Access control allow origin 简单请求和复杂请求
原文地址:http://blog.csdn.net/wangjun5159/article/details/49096445 错误信息: XMLHttpRequest cannot load http ...
- ajax 设置Access-Control-Allow-Origin实现跨域访问
ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 即使使用jquery的jsonp方法,t ...
- ajax实现跨域访问
ajax跨域访问是一个老生畅谈的问题啦,网上解决方法很多,discuz用的p3p协议,有兴趣的朋友可以了解下,比较常用的是JSONP方法,貌似目前这种方法只支持GET方式,不如POST方式安全. 即使 ...
- ajax 跨域访问 :Access-Control-Allow-Origin
一说到ajax跨域.首先想到的就是jsonp . JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 即使使用jQuery的jsonp方法,type设为POST,也 ...
- Hbuilder编辑App时,ajax跨域访问失败问题
今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...
- 基于CAS的SSO单点登录-实现ajax跨域访问的自动登录(也相当于超时重连)
先补课,以下网址可以把CAS环境搭起来. [JA-SIG CAS服务环境搭建]http://linliangyi2007.iteye.com/blog/165307 [JA-SIG CAS业务架构介绍 ...
- ajax设置Access-Control-Allow-Origin实现跨域访问
ajax跨域访问 1.jsonp方法,jsonp方法是一种非官方方法,这种方法只支持GET方式, 不如POST方式安全.(即使使用jquery的jsonp方法,type设为POST, 也会自动变为GE ...
- 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示
随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是 ...
- Ajax跨域访问问题-方法大全
Case I. Web代理的方式 (on Server A) 即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果.此方案可以解决 ...
随机推荐
- HTML 多张图片无缝连接
<table border="0" cellspacing="0" cellpadding="0" style="heigh ...
- 洛谷P2296寻找道路
传送门啦 题目中有一个条件是路径上的所有点的出边所指向的点都直接或间接与终点连通. 所以我们要先判断能否走这一个点, $ bfs $ 类似 $ spfa $ 的一个判断,打上标记. 在这我反向建图,最 ...
- 网络协议之TCP
前言 近年来,随着信息技术的不断发展,各行各业也掀起了信息化浪潮,为了留住用户和吸引用户,各个企业力求为用户提供更好的信息服务,这也导致WEB性能优化成为了一个热点.据分析,网站速度越快,用户的黏性. ...
- 解决insert语句插入时,需要写列值的问题
今天发现解决这个问题其实很简单,闲话不多谈,我直接附上语句 ) select @s = isnull(@s+',', '') + [name] from syscolumns where id = o ...
- CVE-2010-0249 极光
传说中的极光漏洞 Microsoft Internet Explorer非法事件操作内存破坏漏洞 Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏 ...
- BFS && DFS
HDOJ 1312 Red and Black http://acm.hdu.edu.cn/showproblem.php?pid=1312 很裸的dfs,在dfs里面写上ans++,能到几个点就调了 ...
- Zookeeper介绍及安装部署
本节内容: Zookeeper介绍 Zookeeper特点 Zookeeper应用场景 用到了Zookeeper的一些系统 Zookeeper集群安装部署 一.Zookeeper介绍 是一个针对大型分 ...
- 为django平台生成模拟用户,建立用户组,并将用户加入组
书接上篇BLOG. 当我们可以用manage.py自定义命令来生成模拟数据时, 我们面对的就是如何操作ORM的问题了. 这两天,我为我们的内部系统的所有数据表,都生成了模拟数据. 有几个心得,记录于此 ...
- 【51nod】1742 开心的小Q
题解 我们由于莫比乌斯函数如果有平方数因子就是0,那么我们可以列出这样的式子 \(\sum_{i = 1}^{n} \sum_{d|i} (1 - |\mu(d)|)\) 然后枚举倍数 \(\sum_ ...
- Educational Codeforces Round 44 (Rated for Div. 2) F - Isomorphic Strings
F - Isomorphic Strings 题目大意:给你一个长度为n 由小写字母组成的字符串,有m个询问, 每个询问给你两个区间, 问你xi,yi能不能形成映射关系. 思路:这个题意好难懂啊... ...