当前位置: 首页 > news >正文

CRMEB的PHP版本跨域问题

1. /config/cookie.php修改为

return ['expire'    => 0,'path'      => '/','domain'    => '','secure'    => false,'httponly'  => false,'setcookie' => true,// 正确的 CORS 头(开发环境)'header'    => ['Access-Control-Allow-Origin'      => 'http://localhost:1617','Access-Control-Allow-Credentials' => 'true','Access-Control-Allow-Methods'     => 'GET,POST,PUT,PATCH,DELETE,OPTIONS',// 临时兼容:把 authori-zation 也放进来(注意是连字符+全小写)'Access-Control-Allow-Headers'     => 'authorization, Authorization, authori-zation, content-type, x-requested-with, if-modified-since, if-none-match, if-unmodified-since, form-type, cb-lang','Access-Control-Max-Age'           => '1728000','Vary'                             => 'Origin',],'token_name' => 'Authorization',
];

2. public/index.php修改为

//允许跨域
// === CORS(支持凭证)开始 ===
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
// 允许的前端域名白名单(按你实际前端域名填写)
$allowOrigins = ['https://0009.012539.cn','http://localhost:1617',   // 本地调试可选
];if ($origin && in_array($origin, $allowOrigins, true)) {header("Access-Control-Allow-Origin: $origin");header("Access-Control-Allow-Credentials: true");header("Access-Control-Allow-Methods: GET,POST,PUT,DELETE,PATCH,OPTIONS");header("Access-Control-Allow-Headers: DNT,Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization,X-Requested-With,Platform,token");header("Vary: Origin"); // 让代理/缓存按来源区分
}// 预检请求直接放行并返回 204(必须带上相同的 CORS 头)
if (strtoupper($_SERVER['REQUEST_METHOD'] ?? '') === 'OPTIONS') {http_response_code(204);header("Content-Length: 0");exit();
}
// === CORS 结束 ===//end

3. VUE后台/src/libs/request.js

// src/libs/request.js
// +---------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +---------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +---------------------------------------------------------------------import axios from 'axios';
import { Message } from 'element-ui';
import { getCookies, removeCookies } from '@/libs/util';
import Setting from '@/setting';
import router from '@/router';// 用实例自己的默认项;把 withCredentials 放到实例里(很关键)
const service = axios.create({baseURL: Setting.apiBaseURL,timeout: 10000,withCredentials: true, // ✅ 让跨域请求能带上 cookie
});// ❌ 删掉这句(对实例没作用,而且容易误导):
// axios.defaults.withCredentials = true;// 请求拦截器
service.interceptors.request.use((config) => {// 统一 baseURL;kefu 用 kefuapiconfig.baseURL = config.kefu? Setting.apiBaseURL.replace(/adminapi/, 'kefuapi'): Setting.apiBaseURL;// 上传文件时不要手动写 boundary,交给浏览器(可留可去)// if (config.file) {//   config.headers['Content-Type'] = 'multipart/form-data';// }const token = getCookies('token');const kefuToken = getCookies('kefu_token');// 🚫 彻底清掉历史错别字请求头,避免被浏览器带出去if (config.headers) {delete config.headers['authori-zation'];delete config.headers['Authori-zation'];} else {config.headers = {};}// ✅ 统一用标准 Authorizationconst accessToken = config.kefu ? kefuToken : token;if (accessToken) {// 如果后端不需要 Bearer,就改成:config.headers['Authorization'] = accessToken;config.headers['Authorization'] = `Bearer ${accessToken}`;}return config;},(error) => Promise.reject(error),
);// 响应拦截器
service.interceptors.response.use((response) => {// 兼容后端有时返回字符串的情况const raw = response && response.data;const obj = typeof raw === 'string' ? JSON.parse(raw) : (raw || {});const code = obj.status ?? 0;switch (code) {case 200:return obj;// 登录失效(后台)case 110002:case 110003:case 110004:localStorage.clear();removeCookies('token');removeCookies('expires_time');removeCookies('uuid');router.replace({ name: 'login' });return Promise.reject(obj);// 客服登录失效case 110005:case 110006:case 110007:removeCookies('kefuInfo');removeCookies('kefu_token');removeCookies('kefu_expires_time');removeCookies('kefu_uuid');router.replace({ path: '/kefu' });return Promise.reject(obj);case 110008:router.replace({ name: 'system_opendir_login' });return Promise.reject(obj);default:return Promise.reject(obj || { msg: '未知错误' });}},(error) => {// 这里以前传了 undefined 进去导致 element-ui 报 “type” 错误const msg =error?.response?.data?.msg ||error?.response?.data?.message ||error?.message ||'请求失败';Message.error(msg);return Promise.reject(error);},
);export default service;
http://www.jsqmd.com/news/22141/

相关文章:

  • 2025 医疗级胶水厂家最新推荐榜单:权威测评 + 实力厂家甄选,聚焦合规性与技术创新
  • NUIST-OOP-Lab02
  • 2025 年最新推荐!国内球墨铸铁管厂家排行榜:涵盖离心 / 市政 / 防腐 / 给水 / 水利工程用,助力工程高效选材
  • DHCP 泛洪攻击小实验
  • 2025 年热转印花膜优质厂家最新推荐排行榜:聚焦产品质量与客户满意度,涵盖硅胶 / 五金 / 塑胶等多材质应用场景
  • 2025 年国内除湿机厂家最新推荐排行榜:工业 / 家用场景优质品牌精选指南仓库 / 大型 / 车间除湿机公司推荐
  • 题解:P13611 [NWRRC 2022] New Time
  • 2025 年模板加固源头厂家最新推荐榜:优质企业权威测评出炉,含高精 / 剪力墙等多类型模板加固品牌
  • 102302155张怡旋数据采集第一次作业
  • 序列异或求贡献
  • 深入解析:Java外功精要(2)——Spring IoCDI
  • 2025年矩形橡胶支座源头厂家权威推荐榜单:GJZ矩形橡胶支座/圆形橡胶桥梁支座/桥梁橡胶支座源头厂家精选
  • 2025年永磁同步变频器加工厂权威推荐榜单:高压变频柜装置/通用矢量变频器/高压变频器源头厂家精选
  • 首批CCF教学案例大赛资源上线:涵盖控制仿真、算法与机器人等9大方向 - 教程
  • HT-PBR-0006SMG:20W 连续、3 相位失衡,一颗贴片省掉整块匹配网络
  • 2025年人字纹机织布源头厂家权威推荐榜单:700g机织布/锦纶工业用布/800g机织布源头厂家精选
  • 双模更超模!飞利浦双模办公娱乐显示器27E2N5900RW优雅登场! - 实践
  • Day4无序,有序和定义列表
  • 技术管理
  • 威胁狩猎平台升级:全新认证机制与功能增强
  • SpringMVC 启动与请求处理流程解析 - Higurashi
  • 精读C++20设计模式——结构型设计模式:享元模式 - 实践
  • Java 企业 AI 转型选什么?JBoltAI 框架:20 + 大模型 + 向量数据库,AI 应用超灵活
  • 20232401 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 2025 年破胶机厂家最新推荐排行榜:聚焦 610/710/810 型及大型自动低温环保设备,精选优质企业
  • 实用指南:音视频学习(六十七):音视频像素格式
  • 2025 年度深海网箱优质厂家最新推荐排行榜:大型 / 抗风浪 / 全潜式 / 重力式 / 休闲式 / 圆形 / PE/HDPE/ 挪威式网箱领军企业权威测评发布
  • 学习日报 20250928|Java日志规范:从基础规约到高级实践(含SkyWalking整合) - 实践
  • Log4Net配置文件参考
  • 2025年8座旅游观光车供应商权威推荐榜单:11座旅游观光车/景区观光车/燃油观光车源头厂家精选