ThinkPHP6.0处理前端请求跨域问题AllowCrossDomain

简介: ThinkPHP6.0处理前端请求跨域问题AllowCrossDomain

按照官网给出的例子,在中间件配置允许跨域


app/middleware.php

<?php
// 中间件配置
use think\middleware\AllowCrossDomain;
return [
    AllowCrossDomain::class
];

前端请求依然出现了跨域请求提示

Access to XMLHttpRequest at from origin has been blocked by CORS policy: 
Request header field x-token is not allowed by 
Access-Control-Allow-Headers in preflight response.

原因是我们添加了自定义的请求头X-Token用来携带token,所以需要我们重新改造一下中间件

新建一个自定义的跨域中间件

app/middleware/AllowCrossDomainMiddleware.php

<?php
namespace app\middleware;
use think\middleware\AllowCrossDomain;
class AllowCrossDomainMiddleware extends AllowCrossDomain
{
    // 加入自定义请求头参数 X-Token
    protected $header = [
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Max-Age'           => 1800,
        'Access-Control-Allow-Methods'     => 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
        'Access-Control-Allow-Headers'     => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, X-Token',
    ];
}

重新配置中间件

app/middleware.php

<?php
// 中间件配置
use think\middleware\AllowCrossDomain;
use app\middleware\AllowCrossDomainMiddleware;
return [
    // 不使用默认的跨域中间件
    // AllowCrossDomain::class
    // 使用自定义跨域中间件
    AllowCrossDomainMiddleware::class
];

继续改进

查看请求日志发现,options请求会走一遍处理流程,有些需要权限校验的地方还会因为缺少参数而报错,这样肯定不行。

可以在入口文件添加以下代码,单独处理options请求


public/index.php

// 处理 OPTIONS 请求
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'){
    header("'Access-Control-Allow-Credentials: true");
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, X-Token");
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
    exit; // 直接退出,不走后序流程
}

参考

https://www.kancloud.cn/manual/thinkphp6_0/1037493

ThinkPHP 5.1.37 开发跨域问题解决

相关文章
|
前端开发 中间件
ThinkPHP6.0处理前端请求跨域问题AllowCrossDomain
ThinkPHP6.0处理前端请求跨域问题AllowCrossDomain
661 0
|
SQL 存储 分布式计算
ARM+麒麟大数据环境搭建:Hive
ARM+麒麟大数据环境搭建:Hive
1621 0
ARM+麒麟大数据环境搭建:Hive
|
应用服务中间件 JavaScript 虚拟化
阿里云香港轻量应用服务器介绍与测评:月付24元/30Mbps带宽/1TB流量
阿里云香港24是阿里云推出了一款非常优惠的香港的轻量应用服务器,每个月只需要24元,流量有1T,30M的带宽,国内延迟非常低,联通和移动是直连,电信去程ntt,回程cn2,性价比非常高。本文详细介绍这个方案的配置以及做一个简单的测评。
34370 0
|
4月前
|
传感器 边缘计算 人工智能
2025大模型应用平台选型指南:从个人助手到企业级智能体,5大平台场景化拆解
本文深度评测五大主流大模型平台,结合金融、医疗、制造实战案例,解析Open WebUI、Dify、Ragflow、FastGPT与n8n的定位与优势,提供选型决策树与混合架构实例,助你精准匹配业务需求,避开“全能平台”陷阱,实现高效智能化落地。
|
JSON 前端开发 API
【跨域报错解决方案】Access to XMLHttpRequest at ‘http://xxx.com/xxx‘ from origin ‘null‘ has been blocked by
【跨域报错解决方案】Access to XMLHttpRequest at ‘http://xxx.com/xxx‘ from origin ‘null‘ has been blocked by
4492 0
|
8月前
|
前端开发 机器人 API
答疑机器人实践:AgentScope多智能体带你玩转多源召回
答疑机器人实践:AgentScope多智能体带你玩转多源召回
369 3
答疑机器人实践:AgentScope多智能体带你玩转多源召回
|
Web App开发 JSON 安全
Chrome浏览器的跨域问题
【10月更文挑战第6天】
2329 123
|
11月前
|
SQL 关系型数据库 MySQL
宝塔面板之MySQL无法远程连接
宝塔面板默认安装的MySQL,root用户无远程权限。本文详细介绍如何使root支持远程连接:确保3306端口已放行,通过SSH登录服务器并进入MySQL,修改root用户的host为&#39;%&#39;,最后刷新权限。具体步骤包括使用SQL命令修改用户主机设置,并确保网络配置正确,从而实现root的远程访问。
2174 35
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
存储 数据管理 API
零代码能力:轻松搞定表单和API接口,少写80%后端代码,内含资源
小白接口(果创云 YesApi.cn)是一个零代码和低代码开发平台,提供一站式后端云服务,帮助开发者、学生、业余爱好者、工作室、中小企业及无IT技术人员的传统企业快速搭建应用、接口、服务和网站。平台提供500+免费API接口,支持在线API开发、在线表单、数据库管理、图片文件存储、会员管理等功能,无需后端开发经验,轻松实现数据处理和应用开发。