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网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果.此方案可以解决 ...
随机推荐
- Windows版Oracle重建EM---备注
前提条件添加环境变量 ORACLE_HOSTNAME=<主机名:如:DESKTOP-P6J1a>ORACLE_SID=orclORACLE_UNQNAME=orcl 执行删除命令 C:\U ...
- parseObject方法将json字符串转换成Map
String nwVal=recordDO.getWorkOrderNwVal(); HashMap<String,WxhcWorkOrderDO> nwMap=JSON.parseObj ...
- @RequestParam,@PathParam,@PathVariable,@QueryParam注解的使用区别
获取url模板上数据的(/{id})@DefaultValue 获取请求参数的(包括post表单提交)键值对(?param1=10¶m2=20).可以设置defaultValue JA ...
- VirtualBox上安装CentOS-7(Minimal)
Windows 10家庭中文版,VirtualBox 5.2.12,CentOS 7(Minimal版), 因为听到大家在谈论CentOS,阿里云上也有CentOS,CentOS还是Red Hat出品 ...
- .Net程序集强签名详解
强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的dll可以引用强签名 ...
- pom.xml一个简单配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- GLOBAL_NAMES参数研究
最近在配置Stream时,发现必须要把GLOBAL_NAMES参数的指设置为TRUE,具体原因为何不知.但是发现在设置了该参数之后,数据库每天的物化视图刷新出现了问题.之后查明原因,是DBLINK出现 ...
- opencv(1)图像处理
2.图像操作 图片裁剪 裁剪是利用array自身的下标截取实现 HSV空间 除了区域,图像本身的属性操作也非常多,比如可以通过HSV空间对色调和明暗进行调节.HSV空间是由美国的图形学专家A. R. ...
- jquery 分页 下拉框
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- LoadRunner脚本篇
LoadRunner脚本篇 1概述 2脚本录制 3脚本编写 4脚本调试 关 键 词:LoadRunner 性能测试脚本 摘 要:编写一个准确无误的脚本对性能测试有至关重要的意 ...