当你的才华不能撑起你的野心时,就是你该选择学习的时候了!

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

 

posted @ 2025-04-19 06:56  hofmann  阅读(40)  评论(0)    收藏  举报