📅  最后修改于: 2023-12-03 14:40:13.472000             🧑  作者: Mango
跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种Web浏览器的机制,主要用于跨域访问请求,如何使用PHP解决跨越问题是当前PHP开发中必须熟知的问题。
在网页浏览器默认情况下,JavaScript 作为一种脚本语言“同源策略”限制下运行,因安全原因防止脚本非法篡改同源站内的资源。同源策略限制了一个文档或脚本只能从同源中加载文档或执行代码。
CORS 是是一种跨域资源请求的标准。通过添加一个标准的 HTTP 头来告诉浏览器那些跨域的资源是被信任的。
CORS 的产生是在互联网技术业界的标准、规范组织中,如WHATWG、W3C,在遵守现有机制基础上的新需求和新哲学结果。
如银行利用 Web 技术提供服务时,介于安全性的考虑,银行内部域名和所提供服务的 Web 域名可以不同,但浏览器的同源策略会限制 JavaScript 跨越这两个域名资源。CORS 支持让浏览器跨过同源策略,携带其他域名下的服务。
在 PHP 中,常常需要开启 CORS,在返回请求到前端时,CORS 可以控制权限和过滤器,防止被恶意攻击或擅自跨域调用。在 PHP 中,使用 CORS 主要参考以下两个方面:
在向客户端发送数据时,可以使用 header("Access-Control-Allow-Origin: *");
发送 Access-Control-Allow-Origin
的HTTP头,以允许一切源都可以接受数据。在此例子中,PHP 将返回一个包含文本值并带有跨域标头的 JSON 字符串:
<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
// code ...
echo json_encode($response);
?>
CORS 也支持使用 H5API 函数实现跨域。H5API 就是以 HTML5 为核心的API,常常用于移动设备或移动 web 站点开发。使用PHP带有CORS的 H5API,有两种处理跨域的方式:
<?php
header('Content-Type: application/json;charset=utf-8');
$data = [
'name' => 'Lucy',
'age' => 18,
];
$response = [
'code' => 0,
'message' => "Hello CORS",
'data' => $data,
];
$json = json_encode($response);
echo $_GET['callback'].'('.$json.')';
?>
<?php
header('Content-Type: application/json;charset=utf-8');
$data = [
'name' => 'Lucy',
'age' => 18,
];
$response = [
'code' => 0,
'message' => "Hello CORS",
'data' => $data,
];
echo json_encode($response);
?>
调用时 JavaScript 代码:
$.ajax({
url: 'http://www.example.com/test.php',
type: 'GET',
dataType: 'jsonp',
jsonp: 'callback',
success: function(response) {
console.log(response);
},
error: function() {
alert('fail');
},
});
相比较而言,ajax
的调用方式更加普遍,也相对更加安全。
以上是基于 CORS 错误角度分析 PHP 的介绍,需要知道的是 CORS 是用于解决 Web 跨域请求问题的标准,而在 PHP 中,CORS 可以通过两种方式进行控制,使用哪种方式根据场景需求而定。