尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

uniapp H5跨域配置全解:从vue.config.js到后端CORS实战

uniapp H5跨域配置全解:从vue.config.js到后端CORS实战 1. 项目概述为什么uniapp跨域设置是每个H5开发者绕不开的“第一道坎”做uniapp开发尤其是把项目打包成H5嵌入微信公众号、企业内网页面或者独立域名站点时“跨域”这个词几乎天天在控制台报错里蹦出来。我带过三届前端实习生他们第一次在H5环境调用后端API90%以上都会卡在has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource这行红色报错上——不是代码写错了而是根本没搞清“谁在跨域、为什么跨域、该在哪设、设了为什么还不生效”。uniapp本身不处理跨域它只是个构建工具链真正起作用的是底层的Vue CLIvue.config.js、运行时的H5容器manifest.json配置、以及后端服务本身的CORS策略。很多人误以为改个proxy就能一劳永逸结果上线后全崩也有人死磕后端加header却忽略了uniapp H5在iOS WebView或微信X5内核下的特殊限制。这篇文章不讲抽象理论只说我在真实项目中踩过的坑、验证过的路径、以及能直接抄作业的配置组合。适合正在做uniapp H5嵌入微信公众号获取定位、对接FastAPI/PHP后端、或者被cors配置错误(反射 origin credentialstrue)折磨到凌晨三点的开发者。你不需要懂HTTP协议细节但得知道跨域不是bug是浏览器的安全守门员而uniapp跨域设置本质是在前端构建、运行时环境、后端响应三个环节给这个守门员递三张不同但必须匹配的通行证。2. 跨域问题的本质拆解uniapp H5场景下到底谁在拦路2.1 浏览器同源策略是铁律uniapp无法绕过很多人以为“uniapp是跨平台框架应该能自动处理跨域”这是最大误区。uniapp编译成H5后生成的是一套标准HTMLJS文件运行在用户手机的微信内置浏览器X5内核、SafariiOS、ChromeAndroid里。这些浏览器严格遵循同源策略Same-Origin Policy只有当协议http/https、域名example.com、端口80/443三者完全相同时才允许JS脚本读取另一个URL返回的数据。比如你的uniapp H5页面部署在https://h5.yourcompany.com而API接口在https://api.yourcompany.com虽然域名主体一样但子域名不同就构成跨域。更典型的是微信公众号场景公众号菜单跳转到https://h5.yourcompany.com但调用微信JS-SDK的wx.getLocation需要后端接口返回经纬度而这个接口如果部署在https://backend.yourcompany.com立刻触发CORS拦截。注意同源策略只限制JS读取响应体不限制资源加载。所以图片、CSS、JS文件能正常加载但fetch(/api/user)拿到的response.text()会报错——因为浏览器在预检请求OPTIONS阶段就拒绝了。2.2 uniapp的三层架构决定了跨域设置必须分层应对uniapp H5的跨域问题不能靠单一配置解决必须理解它的三层执行环境构建时层vue.config.js仅在本地npm run dev开发模式下生效。Vue CLI的dev-server内置了webpack-dev-server代理它把前端请求“伪装”成同源请求转发给后端从而绕过浏览器拦截。但这只是开发便利打包后的dist目录里不存在任何代理逻辑上线即失效。运行时层manifest.json这是uniapp独有的配置文件控制H5包在WebView中的行为。其中h5 - devServer和h5 - domain字段影响资源加载策略但不控制AJAX请求的CORS头。很多人误以为在这里配domain: https://api.yourcompany.com就能解决跨域实际它只用于配置白名单域名供plus.webview.create等原生API使用对uni.request或fetch无效。运行时层H5容器能力uniapp H5最终运行在WebView中而不同WebView内核对CORS的支持有差异。微信X5内核对credentials: true带cookie请求的CORS校验比Chrome更严格iOS Safari对Access-Control-Allow-Origin: *和credentials: true共存直接拒绝这是W3C规范强制要求。这意味着后端配置了Access-Control-Allow-Origin: *但前端请求带了withCredentials: trueiOS上必然失败——必须后端动态反射Origin头。提示uni.request在H5平台底层就是XMLHttpRequest或fetch所以它完全受浏览器CORS策略约束和axios、fetch行为一致。不要幻想uniapp封装层能突破浏览器安全模型。2.3 真实项目中的跨域组合拳从开发到上线的完整链路以我最近做的一个“微信公众号预约挂号系统”为例完整链路如下开发阶段前端H5页面跑在http://localhost:8080后端API在http://localhost:3000/api。此时用vue.config.js代理所有/api请求被dev-server转发无跨域。测试阶段H5页面部署到测试域名https://test-h5.yourhospital.com后端API在https://test-api.yourhospital.com。此时必须后端开启CORS且Access-Control-Allow-Origin必须精确匹配前端域名不能用*因为前端要携带登录态cookiecredentials: true。上线阶段H5嵌入微信公众号用户访问https://h5.yourhospital.com但微信JS-SDK的wx.config签名接口需调用https://api.yourhospital.com/wx/signature。这里出现新问题微信要求wx.config的jsApiList必须与当前页面同域但签名接口是后端提供的所以必须确保https://h5.yourhospital.com和https://api.yourhospital.com之间CORS策略正确且后端签名接口返回的nonceStr、timestamp等参数能被前端安全接收。这个例子说明跨域设置不是静态配置而是随环境变化的动态策略。开发用代理测试/上线必须后端配合且不同环境的Origin值、credentials需求、HTTPS强制要求都不同。忽略任一环节都会导致“本地好好的一上线就报错”。3. 核心配置详解vue.config.js、manifest.json、后端CORS的实操要点3.1 vue.config.js开发代理的精准配置与避坑指南vue.config.js是开发阶段的救命稻草但配置不当反而埋雷。以下是我验证过的最佳实践// vue.config.js const path require(path) module.exports { // 开发服务器配置 devServer: { port: 8080, host: 0.0.0.0, // 允许局域网访问方便真机调试 https: false, // 开发用http即可避免证书问题 proxy: { // 匹配/api开头的所有请求 /api: { target: http://localhost:3000, // 后端开发地址 changeOrigin: true, // 关键修改请求头origin为target地址 secure: false, // 如果target是https设为true此处http设false pathRewrite: { ^/api: /api // 重写路径/api/user - /api/user保持后端路由不变 }, // 处理WebSocket代理如后端用socket.io ws: true, // 关键cookie转发必须开启 onProxyReq: (proxyReq, req, res) { // 如果后端需要读取cookie必须转发cookie头 if (req.headers.cookie) { proxyReq.setHeader(cookie, req.headers.cookie) } } }, // 配置多个代理例如文件上传接口 /upload: { target: http://localhost:3000, changeOrigin: true, pathRewrite: { ^/upload: /upload } } } } }为什么changeOrigin: true必不可少当浏览器向http://localhost:8080/api/user发起请求dev-server收到后会向http://localhost:3000/api/user转发。如果不设changeOrigin: true转发时请求头Origin仍是http://localhost:8080后端CORS校验时发现Origin不匹配后端只允许http://localhost:3000直接拒绝。changeOrigin: true会自动把Origin头改成http://localhost:3000让后端认为这是同源请求。常见陷阱与解决方案陷阱1代理后端接口返回302重定向前端收不到数据原因dev-server代理不处理重定向响应。解决方案在onProxyRes钩子中捕获重定向手动处理onProxyRes: (proxyRes, req, res) { if (proxyRes.statusCode 302) { const location proxyRes.headers.location // 重写location头指向前端可访问的地址 proxyRes.headers.location location.replace(http://localhost:3000, http://localhost:8080) } }陷阱2上传大文件时超时或中断原因webpack-dev-server默认超时时间短。解决方案增加timeout和proxyTimeout/upload: { target: http://localhost:3000, changeOrigin: true, timeout: 300000, // 5分钟 proxyTimeout: 300000, pathRewrite: { ^/upload: /upload } }陷阱3H5页面在微信中调试代理不生效原因微信内置浏览器访问的是线上地址不是localhost。解决方案开发时用ngrok或localtunnel将本地服务映射为公网地址然后在微信中访问该地址此时vue.config.js代理依然有效因为请求先到本地dev-server再由dev-server转发。3.2 manifest.json被严重误解的H5运行时配置manifest.json常被当作“万能配置文件”但关于跨域它只影响两个关键点3.2.1h5 - devServer仅控制开发时H5页面的加载方式{ name: my-app, appid: , description: , versionName: 1.0.0, versionCode: 100, transformPx: true, app-plus: { /* app配置 */ }, mp-weixin: { /* 小程序配置 */ }, h5: { template: index.html, title: 我的应用, metas: [], devServer: { port: 8080, https: false, proxy: { /api: { target: http://localhost:3000, changeOrigin: true } } } } }注意h5 - devServer里的proxy配置仅在HBuilderX点击“运行到浏览器”时生效且优先级低于vue.config.js。如果你同时配置了vue.config.js和manifest.json的devServer proxyvue.config.js会覆盖后者。所以建议统一在vue.config.js中配置manifest.json里不要重复写。3.2.2h5 - domain白名单域名与CORS无关但影响原生能力h5: { domain: [https://api.yourcompany.com, https://cdn.yourcompany.com] }这个配置的作用是当H5页面调用plus.webview.create创建新窗口或使用plus.downloader.createDownload下载文件时目标URL必须在此白名单中否则被拦截。但它完全不影响uni.request、fetch、axios等网络请求的CORS策略。很多开发者在这里填了API域名以为解决了跨域结果控制台依然报错就是因为混淆了“WebView资源加载白名单”和“浏览器AJAX跨域策略”。3.2.3h5 - useCustomRouter影响路由模式间接关联跨域如果启用自定义路由如hash模式某些后端接口可能依赖window.location.origin生成回调地址。例如微信OAuth2.0授权后端需要知道前端页面的完整域名来拼接redirect_uri。此时若H5用history模式需后端配合而manifest.json未配置h5 - router可能导致redirect_uri域名不匹配引发跨域式跳转失败。解决方案h5: { router: { base: /, mode: history, // 或 hash fallback: true } }3.3 后端CORS配置FastAPI、PHP、Node.js的实操方案前端配置只是半壁江山后端CORS才是最终防线。核心原则Origin必须精确匹配credentials和Origin不能共存于*预检请求OPTIONS必须正确响应。3.3.1 FastAPIPython动态反射Origin的健壮配置FastAPI的CORSMiddleware默认简单但生产环境必须精细化from fastapi import FastAPI, Request, Response from fastapi.middleware.cors import CORSMiddleware from starlette.middleware.base import BaseHTTPMiddleware app FastAPI() # 允许的前端域名列表生产环境必须明确列出禁止用[*] ALLOWED_ORIGINS [ https://h5.yourcompany.com, https://test-h5.yourcompany.com, https://yourcompany.weixin.qq.com # 微信公众号域名 ] # 中间件动态设置Access-Control-Allow-Origin class CustomCORSMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): response await call_next(request) origin request.headers.get(Origin) # 只有Origin在白名单中才设置CORS头 if origin and origin in ALLOWED_ORIGINS: response.headers[Access-Control-Allow-Origin] origin response.headers[Access-Control-Allow-Credentials] true response.headers[Access-Control-Allow-Methods] GET, POST, PUT, DELETE, OPTIONS response.headers[Access-Control-Allow-Headers] Content-Type, Authorization, X-Requested-With response.headers[Access-Control-Expose-Headers] X-Total-Count, X-Page-Number return response app.add_middleware(CustomCORSMiddleware) # 必须显式处理OPTIONS预检请求 app.options(/{full_path:path}) async def preflight_handler(full_path: str): return Response( status_code200, headers{ Access-Control-Allow-Origin: *, # 预检请求允许任意Origin Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With, Access-Control-Allow-Credentials: true } )为什么不用FastAPI内置的CORSMiddleware内置中间件在allow_origins[*]时会强制设置Access-Control-Allow-Origin: *但一旦开启allow_credentialsTrue浏览器会直接拒绝W3C规范。而我们的业务必须带cookie登录态所以必须动态反射Origin。上述自定义中间件确保只有合法Origin才返回对应头其他Origin请求直接无CORS头浏览器按默认策略拦截。3.3.2 PHPLaravel/LumenNginx层与PHP层双保险PHP项目常因.htaccess或php.ini配置混乱导致CORS失效。推荐Nginx层统一处理性能更好且避免PHP代码遗漏# nginx.conf 或 site.conf server { listen 443 ssl; server_name api.yourcompany.com; # SSL配置... location / { # 所有请求添加CORS头 add_header Access-Control-Allow-Origin $http_origin always; add_header Access-Control-Allow-Credentials true always; add_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS always; add_header Access-Control-Allow-Headers Content-Type, Authorization, X-Requested-With always; add_header Access-Control-Expose-Headers X-Total-Count, X-Page-Number always; add_header Access-Control-Max-Age 1728000 always; # 处理预检请求 if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin $http_origin always; add_header Access-Control-Allow-Credentials true always; add_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS always; add_header Access-Control-Allow-Headers Content-Type, Authorization, X-Requested-With always; add_header Access-Control-Max-Age 1728000 always; add_header Content-Length 0; add_header Content-Type text/plain; charsetutf-8; return 204; } # 正常请求代理到PHP-FPM try_files $uri $uri/ /index.php?$query_string; } }关键点解析add_header ... always确保即使PHP返回500错误CORS头依然存在避免因后端异常导致前端无法捕获错误。$http_origin变量Nginx自动获取请求头中的Origin值实现动态反射。if ($request_method OPTIONS)显式拦截OPTIONS请求立即返回204不走PHP逻辑极大提升预检性能。如果必须在PHP代码中设置如共享主机无法改Nginx在public/index.php顶部添加?php $origin $_SERVER[HTTP_ORIGIN] ?? ; $allowedOrigins [https://h5.yourcompany.com, https://test-h5.yourcompany.com]; if (in_array($origin, $allowedOrigins)) { header(Access-Control-Allow-Origin: $origin); header(Access-Control-Allow-Credentials: true); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With); header(Access-Control-Expose-Headers: X-Total-Count, X-Page-Number); } // 预检请求直接退出 if ($_SERVER[REQUEST_METHOD] OPTIONS) { exit(0); }3.3.3 Node.jsExpress中间件的正确写法Express的cors中间件很流行但默认配置有坑const express require(express); const cors require(cors); const app express(); // ❌ 错误允许所有Origin credentials // app.use(cors({ origin: *, credentials: true })); // ✅ 正确动态检查Origin const corsOptions { origin: function (origin, callback) { const allowedOrigins [ https://h5.yourcompany.com, https://test-h5.yourcompany.com, https://yourcompany.weixin.qq.com ]; if (!origin || allowedOrigins.indexOf(origin) ! -1) { callback(null, true); } else { callback(new Error(Not allowed by CORS)); } }, credentials: true, // 允许携带cookie optionsSuccessStatus: 200 // 旧版IE11兼容 }; app.use(cors(corsOptions)); // 显式处理OPTIONS app.options(*, cors(corsOptions));为什么不能用origin: *cors中间件中origin: *会设置Access-Control-Allow-Origin: *与credentials: true冲突。必须用函数形式动态判断并在callback中传true这样中间件内部会设置Access-Control-Allow-Origin: 实际Origin。4. 实战全流程从本地开发到微信公众号上线的跨域配置清单4.1 开发阶段npm run dev确保本地联调零障碍目标http://localhost:8080调用http://localhost:3000/api无跨域报错确认vue.config.js代理配置正确见3.1节重点检查changeOrigin: true和pathRewrite。后端启动时确保监听0.0.0.0:3000而非127.0.0.1:3000否则代理转发失败dev-server和后端不在同一网络栈。在浏览器开发者工具Network标签页查看请求的Request Headers检查Origin头是否为http://localhost:8080浏览器发出检查Response Headers中是否有Access-Control-Allow-Origin: http://localhost:8080后端返回如果没有说明后端CORS未开启或vue.config.js代理未生效检查控制台dev-server日志。测试带cookie的请求登录后调用/api/user/profile检查Request Headers中是否有CookieResponse Headers中是否有Access-Control-Allow-Credentials: true。实操心得我习惯在后端加一行日志console.log(CORS Origin:, req.headers.origin)联调时一眼看出Origin值是否正确。曾因前端axios.defaults.withCredentials true没设导致后端日志显示Origin: undefined浪费两小时排查。4.2 测试阶段部署到测试域名模拟真实环境压力测试目标https://test-h5.yourcompany.com调用https://test-api.yourcompany.com/api成功禁用vue.config.js代理打包命令npm run build:h5生成dist此时代理失效必须依赖后端CORS。Nginx配置测试域名反向代理避免HTTPS证书问题server { listen 80; server_name test-h5.yourcompany.com; root /path/to/dist; index index.html; location / { try_files $uri $uri/ /index.html; } }后端Nginx添加CORS头见3.3.2节并重启Nginx。关键验证步骤在浏览器访问https://test-h5.yourcompany.com打开开发者工具发起API请求检查Response HeadersAccess-Control-Allow-Origin必须等于https://test-h5.yourcompany.com不能是*Access-Control-Allow-Credentials必须为trueAccess-Control-Allow-Methods包含POST如果调用登录接口特别注意如果请求头中有Authorization: Bearer xxxAccess-Control-Allow-Headers必须包含Authorization否则预检失败。注意微信开发者工具调试时window.location.origin是https://developers.weixin.qq.com所以测试时必须把https://developers.weixin.qq.com加入后端CORS白名单否则wx.config签名接口会跨域失败。4.3 上线阶段微信公众号嵌入终极考验与微信特有坑点目标公众号菜单跳转https://h5.yourcompany.com调用https://api.yourcompany.com/wx/signature成功域名备案与HTTPS强制微信要求所有公众号网页必须使用已备案的HTTPS域名。h5.yourcompany.com和api.yourcompany.com均需配置SSL证书推荐Lets Encrypt免费证书。后端CORS白名单加入微信域名# FastAPI示例 ALLOWED_ORIGINS [ https://h5.yourcompany.com, https://developers.weixin.qq.com, # 微信开发者工具 https://www.weixin.qq.com, # 微信正式环境部分版本 https://mp.weixin.qq.com # 微信管理后台 ]微信JS-SDK签名接口的特殊处理前端调用wx.config前必须先请求后端签名接口/wx/signature?urlhttps://h5.yourcompany.com/page1后端用该url参数生成签名但url必须是当前页面的完整URL含hash签名接口返回的nonceStr、timestamp、signature必须通过uni.request获取因此该接口本身必须通过CORS校验致命坑点iOS微信X5内核对Access-Control-Allow-Origin校验极严如果后端返回Access-Control-Allow-Origin: https://h5.yourcompany.com但前端页面实际URL是https://h5.yourcompany.com/#/page1X5内核可能因hash部分不匹配而拒绝。解决方案后端签名接口不校验Origin或使用Access-Control-Allow-Origin: *仅限签名接口且不返回敏感数据。iOS真机测试必做项清除微信缓存微信 → 我 → 设置 → 通用 → 存储空间 → 清理缓存在Safari中访问https://h5.yourcompany.com检查是否提示“不安全”证书问题使用Safari开发者工具远程调试iOS微信Safari → 开发 → [设备名] → [页面名]查看Network请求的CORS头。4.4 跨域问题速查表根据报错信息快速定位控制台报错信息最可能原因快速验证方法解决方案No Access-Control-Allow-Origin header is present后端未返回CORS头查看Network → Response Headers确认无Access-Control-Allow-Origin检查后端Nginx配置或代码确保CORS中间件启用The value of the Access-Control-Allow-Origin header must not be the wildcard * when the requests credentials mode is include后端Access-Control-Allow-Origin: *与credentials: true共存检查前端uni.request是否设withCredentials: true后端返回的Origin头是否为*后端改为动态反射Origin如Access-Control-Allow-Origin: https://h5.yourcompany.comFailed to fetch无详细错误预检请求OPTIONS失败Network中查找OPTIONS请求看其状态码是否为200检查后端是否正确处理OPTIONSNginx中是否配置if ($request_method OPTIONS)Redirect from https://api.com/login to https://api.com/callback has been blocked by CORS policy重定向后的新URL跨域查看Network中重定向链路确认最终URL是否同源后端避免302重定向改用200返回重定向URL前端window.location.href跳转has been blocked by CORS policy: Response to preflight request doesnt pass access control check: It does not have HTTP ok statusOPTIONS请求返回非200/204查看OPTIONS请求的Response确认状态码Nginx中return 204或后端代码res.status(204).end()5. 高阶技巧与避坑经验那些文档里不会写的实战真相5.1 “伪跨域”方案JSONP在uniapp H5中的复活虽然现代开发普遍弃用JSONP但在某些极端场景下它仍是救命稻草后端完全无法修改CORS配置如第三方老系统且接口只支持GET。uniapp H5可以安全使用JSONP因为script标签不受同源策略限制。// utils/jsonp.js function jsonp(url, params {}) { return new Promise((resolve, reject) { const script document.createElement(script) const callbackName jsonp_${Date.now()}_${Math.random().toString(36).substr(2, 9)} // 拼接URL const queryString Object.keys(params) .map(key ${encodeURIComponent(key)}${encodeURIComponent(params[key])}) .join() const fullUrl ${url}?${queryString}callback${callbackName} // 定义全局回调 window[callbackName] (data) { resolve(data) // 清理 document.head.removeChild(script) delete window[callbackName] } script.src fullUrl script.onerror () { reject(new Error(JSONP request failed)) document.head.removeChild(script) delete window[callbackName] } document.head.appendChild(script) }) } // 使用 jsonp(https://third-party-api.com/data, { id: 123 }) .then(data console.log(data)) .catch(err console.error(err))适用场景对接政府公开数据接口如天气、地理编码对方只提供JSONP企业内网老系统运维拒绝修改Nginx配置微信公众号中调用https://api.weixin.qq.com/cgi-bin/token微信官方接口支持JSONP。局限性仅支持GET请求无法设置请求头如Authorization错误处理弱script标签只触发onerror不区分HTTP状态码安全风险执行第三方脚本需确保URL可信。5.2 iOS WebView的CORS黑魔法webview注入与WKWebView配置uniapp H5在iOS上表现异常常因WKWebView的严格策略。HBuilderX打包App时可通过manifest.json配置ios - usingWKWebView但H5在微信中无法控制。不过我们可以在H5页面加载时通过document.write注入一段脚本尝试绕过限制仅限特定场景// 在main.js最顶部执行 if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { // iOS设备尝试注入CORS bypass脚本需后端配合 const script document.createElement(script) script.src https://h5.yourcompany.com/cors-bypass.js // 该脚本由后端动态生成内容为JSONP回调 document.head.appendChild(script) }更可靠的方法是后端提供一个同域代理接口前端请求https://h5.yourcompany.com/proxy?urlhttps://api.third.com/data后端/proxy接口用curl或axios请求第三方URL再将结果返回给前端因为/proxy与H5同域无跨域问题。此方案牺牲性能多一次后端转发但100%可靠且可添加缓存、限流、日志。5.3 uniappuni.request的隐藏参数sslVerify与firstIpv4在uniapp 3.0中uni.request新增了sslVerify和firstIpv4参数虽不直接解决跨域但影响HTTPS请求成功率uni.request({ url: https://api.yourcompany.com/data, method: GET, sslVerify: false, // ⚠️ 仅测试环境使用生产环境必须true firstIpv4: true, // 强制使用IPv4避免IPv6 DNS解析失败 success: (res) { console.log(res.data) } })sslVerify: false跳过SSL证书校验。生产环境绝对禁止仅用于测试自签名证书。iOS对证书链要求严格若后端证书缺失中间CA会导致net::ERR_CERT_AUTHORITY_INVALID看似跨域实为证书错误。firstIpv4: true国内部分运营商DNS解析IPv6失败导致请求超时。开启后优先使用IPv4提升稳定性。5.4 终极排查工具curl模拟浏览器请求当浏览器报错模糊时用curl直连后端排除前端干扰# 模拟带Origin和Credentials的请求 curl -v \ -H Origin: https://h5.yourcompany.com \ -H Cookie: sessionidabc123 \ -H Content-Type: application/json \ https://api.yourcompany.com/api/user # 模拟预检请求OPTIONS curl -v \ -X OPTIONS \ -H Origin: https://h5.yourcompany.com \ -H Access-Control-Request-Method: POST \ -H Access-Control-Request-Headers: Content-Type, Authorization \ https://api.yourcompany.com/api/login观察curl输出的 Access-Control-Allow-Origin:等头与浏览器Network中的一致则问题在前端若curl无CORS头问题一定在后端配置。我的血泪教训曾因Nginx配置中add_header写在location /块外导致OPTIONS请求不继承CORS头curl -X OPTIONS返回200但无CORS头而浏览器因预检失败直接拦截。最终在Nginx中为OPTIONS单独配置add_header解决。6. 常见问题与排查技巧实录真实项目中的12个典型故障6.1 问题1H5页面在
返回列表