1. 跨域问题背景与核心原理
作为一名经历过多次前后端分离项目的老手,我深知跨域问题是每个开发者都会遇到的"拦路虎"。当Vue前端项目运行在http://localhost:8080,而ThinkPHP后端API服务部署在http://api.example.com时,浏览器出于安全考虑会阻止这种跨域请求。
跨域问题的本质是浏览器的同源策略(Same-Origin Policy)限制。这个策略要求:
- 协议相同(http/https)
- 域名相同
- 端口相同
任何一项不满足就会触发跨域限制。现代项目中前后端分离是常态,所以必须解决这个问题。常见的解决方案有:
- JSONP(已过时,仅支持GET)
- 前端代理(开发环境常用)
- 后端CORS(最规范的解决方案)
提示:CORS(Cross-Origin Resource Sharing)是W3C标准,通过在服务端设置响应头来告诉浏览器该请求允许跨域。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ThinkPHP中间件解决方案详解
2.1 中间件核心代码解析
我提供的MyCrossDomain中间件是经过多个项目验证的稳定方案。让我们拆解关键部分:
php复制protected $header = [
'Access-Control-Allow-Credentials' => 'true', // 允许携带凭证(如cookies)
'Access-Control-Max-Age' => 1800, // 预检请求缓存时间(秒)
'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS', // 允许的HTTP方法
'Access-Control-Allow-Headers' => 'token,Content-Type...', // 允许的自定义请求头
];
这段配置定义了:
Allow-Credentials:当需要传输cookies时必须设为true,且Allow-Origin不能为*Max-Age:减少OPTIONS预检请求次数,提升性能Allow-Methods:根据实际需求调整,不要盲目开放所有方法
