后端返回指定Access-Control-Allow-Origin,控制台报*相关CORS错误且GET无响应头
解决CORS错误:Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’
核心问题分析
- 错误提示与实际预检响应不符:你看到的OPTIONS预检响应头是正确的(
access-control-allow-origin: https://localhost:4000),但控制台错误提示Access-Control-Allow-Origin是*,这大概率是因为实际的GET请求没有返回任何响应头——浏览器无法获取到正确的CORS头,因此触发了默认的错误提示。 - 手动发送OPTIONS请求无必要:你的fetch代码里指定了
method: "OPTIONS",但浏览器会自动为跨域GET请求发起预检OPTIONS请求,手动发送OPTIONS不会触发后续实际GET请求,反而会干扰正常流程。 - 响应头格式可能不规范:你提到后端返回的
access-control-allow-origin: 'https://localhost:4000'带单引号,这不符合HTTP头规范,会被浏览器识别为无效值,进而触发类似*的错误逻辑。
解决方案
1. 修复后端GET请求的响应头
确保后端处理https://exampleurl/api/user/whoIam的GET请求时,返回规范的CORS响应头:
- 必须包含
access-control-allow-origin: https://localhost:4000(不要加单/双引号) - 由于你的fetch设置了
credentials: "omit",可以去掉access-control-allow-credentials: true(该头仅在需要携带凭证时有用)
2. 修改fetch请求代码
将请求方法改为GET,移除手动OPTIONS请求:
await fetch("https://exampleurl/api/user/whoIam", { "credentials": "omit", "headers": { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "cross-site", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache" }, "referrer": "https://localhost:4000/", "method": "GET", "mode": "cors" });
3. 验证响应头有效性
在开发者工具的「网络」面板中,查看GET请求的响应头:
- 确认
access-control-allow-origin存在且值为https://localhost:4000(无引号) - 确认请求返回200或其他合法状态码,而非无响应头的异常情况
内容的提问来源于stack exchange,提问作者rofrol
相关产品推荐
相关产品推荐

