摘要: 因为是前后端分离的项目,所以一般情况下前端会使用一个域名,后端接口部分也会使用一个域...
因为是前后端分离的项目,所以一般情况下前端会使用一个域名,后端接口部分也会使用一个域名,两个域名进行通信,势必浏览器会报告跨域的一个问题,在这里我讲的是如何用PHP给前端请求做一个针对性的跨域处理办法
具体上截图说明
首先你得明确你允许的跨域的域名有哪些,可以用一个数组去承装它们
之后写一个接口模块的控制器基类,凡事访问到任何控制器都需要访问这个基类,要不然也不能叫做基类对不对。然后基类就要对客户端域名进行一个检测方法,不在允许跨域的域名统统挡住
下面是基类,下面调用检测跨域的方法
代码:
<?php
namespace app\api\controller;
use think\Controller;
class Cross extends Controller
{
protected function initialize()
{
parent::initialize(); // TODO: Change the autogenerated stub
//跨域请求检测
check_cors_request();
//检测IP是否允许
check_ip_allowed();
}
}
下面是跨域请求检测方法
代码
if (!function_exists('check_cors_request')) {
/**
* 跨域检测
*/
function check_cors_request()
{
if (isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN']) {
$info = parse_url($_SERVER['HTTP_ORIGIN']);
$domainArr = explode(',', config('other.cors_request_domain'));
$domainArr[] = request()->host(true);
if (in_array("*", $domainArr) || in_array($_SERVER['HTTP_ORIGIN'], $domainArr) || (isset($info['host']) && in_array($info['host'], $domainArr))) {
header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
} else {
$response = Response::create('跨域检测无效', 'html', 403);
throw new HttpResponseException($response);
}
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) {
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
}
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) {
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
}
$response = Response::create('', 'html');
throw new HttpResponseException($response);
}
}
}
}
高兴,再添加一个防止ip抓取数据的方法
代码
if (!function_exists('check_ip_allowed')) {
/**
* 检测IP是否允许
* @param string $ip IP地址
*/
function check_ip_allowed($ip = null)
{
$ip = is_null($ip) ? request()->ip() : $ip;
$forbiddenipArr = json_decode(Files::get_json_file(env("RUNTIME_PATH") . "set" . "/webset.php"),true)['forbiddenip'];
$forbiddenipArr = !$forbiddenipArr ? [] : $forbiddenipArr;
$forbiddenipArr = is_array($forbiddenipArr) ? $forbiddenipArr : explode('|',$forbiddenipArr);
if ($forbiddenipArr && IpUtils::checkIp($ip, $forbiddenipArr)) {
$response = Response::create('请求无权访问', 'html', 403);
throw new HttpResponseException($response);
}
}
}