Admin.Net部署:CORS规范 Access-Control-Allow-Origin 赋值问题
问题描述:
Access to XMLHttpRequest at 'http://api.xxx.xxx/api/sysConfig/sysInfo' from origin 'http://localhost:8888' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:8888, *', but only one is allowed.
sys-config-api.ts:703
翻译:
这个错误是由于服务器在预检(preflight)响应中返回了多个Access-Control-Allow-Origin
头信息,而CORS规范不允许这种情况。
问题原因
您的前端应用在http://localhost:8888尝试向http://api.xxx.xxx/api/sysConfig/sysInfo发起请求时出现以下情况:
服务器在Access-Control-Allow-Origin头中同时返回了http://localhost:8888和*
但该头信息按规定只能包含一个值
解决方案
1. 服务器端修复(推荐)
最佳解决方案是修改服务器配置,只返回一个Access-Control-Allow-Origin值:
// Express.js示例解决方案 app.use(cors({ origin: process.env.NODE_ENV === 'development' ? 'http://localhost:8888' : 'https://您的生产环境域名.com' }));
JSON配置节点:
WithOrigins": [ "http://localhost:5005", "https://gitee.com" ], // 允许的跨域地址
ASP.NET Core
services.AddCors(options => { options.AddPolicy("AllowFrontend", builder => { builder.WithOrigins("http://localhost:8888", "https://生产环境域名.com") .WithMethods("GET", "POST", "PUT", "DELETE") .WithExposedHeaders("Content-Disposition", "x-access-token") .AllowCredentials(); }); });
前端配合调整
如果前端使用 Axios,确保配置了 withCredentials:
axios.get("http://api.xxx.xxx/api/data", { withCredentials: true // 允许跨域携带Cookie/Token });
验证是否生效
使用浏览器开发者工具检查响应头:
应存在 单条 Access-Control-Allow-Origin,值为 http://localhost:8888。
暴露的头部(如 x-access-token)需出现在 Access-Control-Expose-Headers 中。
测试预检请求:
curl -I -X OPTIONS -H "Origin: http://localhost:8888" http://api.xxx.xxx/api/sysConfig/sysInfo