当前位置: 首页 > 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.gsyq.cn/news/30242.html

相关文章:

  • Paper: Learning Affordances at Inference-Time for Vision-Language-Action Models
  • 2025 年热转印花膜优质厂家最新推荐排行榜:聚焦产品质量与客户满意度,涵盖硅胶 / 五金 / 塑胶等多材质应用场景
  • 2025 年国内除湿机厂家最新推荐排行榜:工业 / 家用场景优质品牌精选指南仓库 / 大型 / 车间除湿机公司推荐
  • 第1期(两题)
  • 门店运营成本高企?AI智能解决方案助力降本增效 - 教程
  • 102302155张怡旋数据采集第一次作业
  • 深入解析:Java外功精要(2)——Spring IoCDI
  • 2025年矩形橡胶支座源头厂家权威推荐榜单:GJZ矩形橡胶支座/圆形橡胶桥梁支座/桥梁橡胶支座源头厂家精选
  • 威胁狩猎平台升级:全新认证机制与功能增强
  • 精读C++20设计模式——结构型设计模式:享元模式 - 实践
  • JBoltAI:企业级 Java AI 应用开发框架
  • 实用指南:音视频学习(六十七):音视频像素格式
  • 2025年铁氟龙高温线厂家权威推荐榜:极细铁氟龙/UL10064铁氟龙/UL1332铁氟龙/UL1867铁氟龙/UL10064极细铁氟龙/UL1332极细铁氟龙/UL1867极细铁氟龙专业解析
  • 2025年卫衣品牌权威推荐榜:精选纯棉/加绒/oversize/情侣款卫衣源头厂家,潮流与舒适兼备的穿搭首选
  • 2025年透声膜厂家权威推荐榜:防水透声膜,透气透声膜,手表/耳机/智能手环专用透声膜优质供应商精选
  • 2025年实木家具厂家权威推荐榜:原木/全实木/北美黑胡桃/樱桃木/榫卯工艺高端定制,实木全屋整装,烘干/白胚/木蜡油保养,经典款品质之选
  • 2025年环境试验设备厂家权威推荐榜:冷热冲击/高低温/氙灯耐候/步入式恒温恒湿/HAST老化/机械淋雨试验箱全方位解析
  • 2025年高压加速老化设备厂家推荐排行榜,高压加速老化HAST,高压加速老化PCT,热流仪源头厂家最新权威测评与选购指南
  • CICD流程建设之持续集成实践指南
  • Codeforces Round 1049 (Div. 2)C. Ultimate Value
  • iPhone 上某人发来的短信消失了?9 种解决方法
  • freebsd14.3:安装kde6
  • vue: vue下载项目安装依赖库
  • 如何在1v1一对一视频直播交友APP中实现防录屏防截屏功能?
  • 基于SpringBoot3+Vue3的宠物领养平台、猫狗领养平台、宠物救助管理系统、流浪动物领养管理系统,毕业设计,课程设计
  • 2025 年最新推荐炼铅炉实力厂家排行榜:含废电瓶反射大型环保等设备,权威测评优选企业盘点可移动/熔/设备/无烟/新型炼铅炉厂家盘点
  • Android 网络请求:EasyNet(Okhttp + retrofit + flow + gson + 缓存 + 文件下载 + 文件上传 + 人性化Loading窗)
  • 基于格的抗量子密码
  • Yolo11Onnx——图像后处理
  • 2025 年不锈钢方管制造厂家最新推荐排行榜:权威测评选出高性能可靠性优质品牌榜单不锈钢矩形管/不锈钢管材/不锈钢异行管/不锈钢毛细管公司推荐