php方案 PHP的跨域资源共享(CORS)深度 📅 发布时间:2026/7/8 11:54:59 👁️ 浏览次数: PHP的跨域资源共享CORS深度 先说问题 浏览器安全策略A域名的JS不能请求B域名的API前端 http://app.com → 请求 → http://api.com/users ← 浏览器拦截CORS服务器告诉浏览器我允许你来---浏览器的两种请求 简单请求GET/POST普通Header → 直接发服务器响应头控制 预检请求PUT/DELETE/自定义Header → 先发OPTIONS问一句我能来吗服务器回答后才发真正请求---1.基础实现classCorsMiddleware{privatearray$config[origins[https://app.com,https://admin.com],methods[GET,POST,PUT,DELETE,OPTIONS],headers[Content-Type,Authorization,X-Request-ID],max_age86400,// 预检结果缓存24小时credentialstrue,];publicfunctionhandle(Request$req,callable$next):Response{$origin$req-header(Origin);// 不在白名单不加CORS头浏览器会拦截if(!in_array($origin,$this-config[origins])){return$next($req);}// 预检请求直接返回不走业务逻辑if($req-method()OPTIONS){return$this-preflight($origin);}$response$next($req);return$this-addHeaders($response,$origin);}privatefunctionpreflight(string$origin):Response{returnresponse(204,,[Access-Control-Allow-Origin$origin,Access-Control-Allow-Methodsimplode(,,$this-config[methods]),Access-Control-Allow-Headersimplode(,,$this-config[headers]),Access-Control-Max-Age$this-config[max_age],Access-Control-Allow-Credentialstrue,]);}privatefunctionaddHeaders(Response$res,string$origin):Response{return$res-withHeaders([Access-Control-Allow-Origin$origin,// 不能用*否则credentials失效Access-Control-Allow-Credentialstrue,VaryOrigin,// 告诉CDN按Origin缓存]);}}---2.关键细节 通配符*的坑// 错误带cookie/Authorization时* 不生效header(Access-Control-Allow-Origin: *);header(Access-Control-Allow-Credentials: true);// 浏览器直接报错// 正确动态反射Origin白名单验证后$origin$_SERVER[HTTP_ORIGIN]??;if(in_array($origin,$allowedOrigins)){header(Access-Control-Allow-Origin:$origin);header(Access-Control-Allow-Credentials: true);header(Vary: Origin);// 必须加否则CDN缓存串了}---暴露自定义响应头// 默认浏览器只能读6个安全响应头// 自定义头必须显式暴露header(Access-Control-Expose-Headers: X-Request-ID, X-RateLimit-Remaining);// 前端才能读到// response.headers.get(X-Request-ID) // ✓---带凭证请求CookieAuthorization// 服务端header(Access-Control-Allow-Origin: https://app.com);// 必须指定不能*header(Access-Control-Allow-Credentials: true);// 前端必须配合fetch(https://api.com/user,{credentials:include// 带cookie});// axiosaxios.defaults.withCredentialstrue;---3.动态白名单多租户场景classDynamicCorsHandler{publicfunctiongetAllowedOrigin(string$origin):?string{// 精确匹配if(in_array($origin,$this-staticWhitelist))return$origin;// 子域名通配*.company.com$hostparse_url($origin,PHP_URL_HOST);if(preg_match(/^[\w-]\.company\.com$/,$host))return$origin;// 数据库动态白名单SaaS多租户$tenant$this-db-query(SELECT id FROM tenants WHERE origin? AND active1,[$origin])-fetch();return$tenant?$origin:null;}}---4.安全陷阱// ✗ 危险不验证直接反射header(Access-Control-Allow-Origin:{$_SERVER[HTTP_ORIGIN]});// ✗ 危险正则太宽松preg_match(/company\.com/,$origin)// evil-company.com 也能通过// ✓ 正确精确白名单 或 严格正则preg_match(/^https:\/\/([\w-]\.)?company\.com$/,$origin)// ✗ 危险OPTIONS不拦截就直接返回绕过认证if($methodOPTIONS){addCorsHeaders();exit;// 忘了验证TokenOPTIONS请求直接过了}// ✓ 正确OPTIONS只返回CORS头不泄露业务数据// 认证中间件在CORS中间件之后执行---5.Nginx 层处理推荐# 不走PHP性能更好location/api/{set$cors_origin;if($http_origin~*^https://(app|admin)\.company\.com$){set$cors_origin$http_origin;}if($request_methodOPTIONS){add_header Access-Control-Allow-Origin$cors_originalways;add_header Access-Control-Allow-MethodsGET,POST,PUT,DELETEalways;add_header Access-Control-Allow-HeadersAuthorization,Content-Typealways;add_header Access-Control-Max-Age86400always;return204;}add_header Access-Control-Allow-Origin$cors_originalways;add_header Access-Control-Allow-Credentialstruealways;add_header Vary Origin always;}---中间件执行顺序 请求进来 ↓CORS中间件 ← 最先执行OPTIONS直接返回 ↓ 限流中间件 ↓ 认证中间件 ← 验证Token/Cookie ↓ 业务逻辑---全景图 浏览器PHP服务器 │ │ │──OPTIONS/api/user ──────────│ 预检我能发DELETEAuthorization吗 │─204Allow-Origin/Methods ───│ 回答能缓存24小时 │ │ │──DELETE/api/user ───────────│ 真正请求 │ Authorization:Bearer xxx │ │─200Allow-Origin ─────────│ 响应带CORS头浏览器放行 关键头 请求方 Origin → 响应方 ← Access-Control-Allow-Origin必须 ← Access-Control-Allow-Credentials带cookie时 ← Vary:OriginCDN缓存隔离---一句话CORS服务器白名单校验Origin预检OPTIONS返回许可响应头告知浏览器放行带凭证时禁用*必须动态反射Vary:Origin防CDN缓存串。
量子骗局揭秘:伪量子算法代码证据 在当今量子计算热潮中,伪量子算法骗局频发,它们披着“革命性技术”的外衣,却只输出无效结果。作为软件测试从业者,您可能面对过这类代码:它声称利用量子叠加或纠缠,但实际只是传统算法的拙劣伪装。本文将带… 2026/7/8 17:08:30
毕设程序javaEHS安全环保管理系统 基于SpringBoot的企业环境健康安全(EHS)数字化管控平台 Java驱动的企业HSE安全生产与环境保护综合管理平台 毕设程序javaEHS安全环保管理系统1kw4d9fa(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在全球化竞争与可持续发展双重驱动下,企业面临着日益严格的环境法规与职业健… 2026/7/8 17:07:59
高龄开发者白皮书:45+雇主红榜 打破年龄迷思的技术价值重构在软件测试领域,经验沉淀与场景覆盖能力直接影响缺陷捕获效率。本文基于全球32家科技企业的用人数据(2025年DevAge研究报告),揭示45测试工程师在复杂系统验证、质量风险评估及团队赋能中的不可替代性&a… 2026/7/7 18:25:10
Windows安卓应用安装终极指南:告别模拟器,原生运行Android APK Windows安卓应用安装终极指南:告别模拟器,原生运行Android APK 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行… 2026/7/8 17:10:01
从信息收集到漏洞验证:构建系统化网络安全渗透测试思维框架 1. 项目概述:从“脚本小子”到“挖洞猎人”的思维跃迁刚接触信息安全那会儿,我总以为“漏洞挖掘”就是拿着网上找来的工具,对着目标一顿乱扫,然后坐等工具弹出几个红色的“高危”提示。这种想法,让我在很长一段时间里都… 2026/7/8 17:10:01
使用RenderDoc从Unity游戏无损提取带UV模型并导出FBX全流程 1. 项目概述:从游戏画面到可编辑模型在游戏开发、美术资源学习或者同人创作中,我们常常会被一些优秀游戏里的精美模型所吸引。无论是想研究其建模布线、学习贴图绘制技巧,还是想提取出来用于个人非商业的二次创作,直接获取游戏原始… 2026/7/8 17:05:52
Unity NavMesh导航系统:从原理到实战,打造智能角色移动 1. 项目概述:为什么你的游戏角色需要更聪明的“脚”? 在Unity里鼓捣过角色移动的开发者,估计都经历过这么几个阶段:最开始,可能就是给角色一个速度向量,让他直来直去;后来发现会穿墙,… 2026/7/8 17:05:52
Unity怪物卡车资产包深度解析:从物理系统到二次开发实战 1. 项目概述:为什么一个“怪物卡车资产包”值得你花时间研究?如果你正在用Unity开发游戏,尤其是涉及载具、物理模拟或者需要快速原型验证的项目,那么一个高质量的“怪物卡车资产包”绝不仅仅是一堆模型文件。我最近深度使用了一款… 2026/7/8 17:03:51
DGNN 实战:基于 PyTorch 实现动态图节点分类,准确率提升 12% DGNN 实战:基于 PyTorch 实现动态图节点分类,准确率提升 12%动态图神经网络(DGNN)正在成为处理时序图数据的利器。与静态图不同,动态图的拓扑结构和节点属性会随时间演变,这为传统图神经网络带来了巨大挑战… 2026/7/8 17:03:51
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08