You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core WebAPI部署至服务器后CORS配置失效的问题咨询

ASP.NET Core WebAPI部署至服务器后CORS配置失效的问题咨询

看起来你踩了部署后CORS配置不生效的坑,而且错误提示是预检请求被重定向导致的,这个问题我之前在部署项目的时候也碰到过,咱们一步步拆解排查:

首先,先搞懂当前错误的核心原因

你看到的错误:Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request,意思是浏览器发起的CORS预检请求(也就是OPTIONS请求)被服务器重定向了——而浏览器对预检请求的要求很严格,绝对不允许重定向,所以直接就拦截了请求。

接下来咱们一步步排查解决


1. 先检查服务器的重定向/URL重写规则

这是最常见的触发这个错误的原因:

  • 比如你的服务器是不是配置了HTTP强制跳转HTTPS?比如IIS里的“HTTP重定向”模块,或者Nginx的rewrite规则,会把所有HTTP请求(包括OPTIONS预检请求)都转到HTTPS,这时候浏览器就会报错。
  • 或者有没有其他URL重写规则(比如把不带www的域名转到带www,或者修改路径),导致OPTIONS请求被意外重定向。

解决办法

  • 如果是IIS:在URL重写规则里添加一个条件,排除OPTIONS请求。比如在重定向规则的“条件”里加一条:{REQUEST_METHOD} 不等于 OPTIONS,这样预检请求就不会被重定向了。
  • 如果是Nginx:在配置里直接对OPTIONS请求返回204状态码,避免重定向:
    if ($request_method = OPTIONS) {
        return 204;
    }
    

2. 检查ASP.NET Core里CORS中间件的注册顺序

这个也是很多人容易踩的坑:CORS中间件的注册顺序必须在路由中间件之前,而且要在认证/授权中间件之前,不然CORS配置根本不会生效。

正确的顺序应该是这样的:

var app = builder.Build();

// 先注册CORS中间件!
app.UseCors("AllowLocalFrontend");

// 然后才是路由
app.UseRouting();

// 再是认证授权
app.UseAuthorization();

// 最后是端点映射
app.MapControllers();

app.Run();

如果你的代码里app.UseCors()是在app.UseRouting()之后加的,赶紧调顺序!

3. 修正CORS策略的Origin配置

看你的错误日志,前端是从http://localhost:5173发起的请求,但你在服务器上的CORS策略里只加了ngrok的地址https://bc51b90fyae6d8.ngrok-free.app——这时候如果是本地前端访问服务器API,http://localhost:5173不在允许列表里,即使解决了重定向问题,后续还是会有CORS错误。

建议你可以区分环境配置Origin:

var isDevelopment = builder.Environment.IsDevelopment();
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowFrontend", policy =>
    {
        if (isDevelopment)
        {
            // 开发环境允许本地前端和ngrok地址
            policy.WithOrigins("http://localhost:5173", "https://bc51b90fyae6d8.ngrok-free.app");
        }
        else
        {
            // 生产环境配置正式的前端域名
            policy.WithOrigins("https://your-production-frontend.com");
        }
        policy.AllowAnyMethod()
              .AllowAnyHeader()
              .AllowCredentials();
        // 注意:生产环境别用SetIsOriginAllowed(origin => true),这等于允许所有域名,不安全
    });
});

4. 验证预检请求的响应

你可以用curl或者Postman直接发一个OPTIONS请求到你的API地址,看看返回的状态码:

curl -X OPTIONS http://testsv.shilordsafw.net:30052/api/profile/50 -i

如果返回的是301/302(重定向),那肯定是重定向的问题,先解决这个;如果返回200/204,再看CORS响应头里有没有包含你的前端Origin。

最后总结下优先级

当前最紧急的是解决预检请求被重定向的问题,这是导致你现在看到的错误的直接原因;解决完这个之后,再检查CORS中间件顺序和Origin配置,应该就能彻底解决问题了。

如果还有疑问,可以补充下服务器的环境(比如是IIS、Nginx还是其他),我再给你更具体的建议~

火山引擎 最新活动