本文作者:DurkBlue

PHP前后端分离,对跨域请求的妥善处理推荐

DurkBlue2022-12-201346
PHP前后端分离,对跨域请求的妥善处理摘要:         因为是前后端分离的项目,所以一般情况下前端会使用一个域名,后端接口部分也会使用一个域...

        因为是前后端分离的项目,所以一般情况下前端会使用一个域名,后端接口部分也会使用一个域名,两个域名进行通信,势必浏览器会报告跨域的一个问题,在这里我讲的是如何用PHP给前端请求做一个针对性的跨域处理办法


        具体上截图说明


        首先你得明确你允许的跨域的域名有哪些,可以用一个数组去承装它们


        PHP前后端分离,对跨域请求的妥善处理 第1张



    之后写一个接口模块的控制器基类,凡事访问到任何控制器都需要访问这个基类,要不然也不能叫做基类对不对。然后基类就要对客户端域名进行一个检测方法,不在允许跨域的域名统统挡住


    下面是基类,下面调用检测跨域的方法


    PHP前后端分离,对跨域请求的妥善处理 第2张


代码:

<?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();

    }
}



    下面是跨域请求检测方法


    PHP前后端分离,对跨域请求的妥善处理 第3张


代码


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抓取数据的方法


PHP前后端分离,对跨域请求的妥善处理 第4张


代码


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);
      }
  }
}


此篇文章由DurkBlue博客申请发布,转载吧请注明来处
文章投稿或转载声明

来源:DurkBlue版权归原作者所有,转载请保留出处。本站文章发布于 2022-12-20
温馨提示:文章内容系作者个人观点,不代表DurkBlue博客对其观点赞同或支持。

赞(1)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享