You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Axum路由配置CorsLayer仍拒绝CORS OPTIONS预检请求返回405

解决Axum服务器OPTIONS请求405错误的问题

你的问题核心是CorsLayer中间件的执行顺序不对,导致浏览器发送的OPTIONS预检请求没被CorsLayer处理,就被路由的方法匹配规则拦截返回了405。

修复步骤:

  1. 调整中间件顺序:将CorsLayer::permissive()移到所有中间件的最前面,确保它能优先处理OPTIONS请求,避免请求先进入路由匹配环节:
let app = Router::new()
    .layer(CorsLayer::permissive()) // 放在最前面
    .layer(TraceLayer::new_for_http())
    .route("/api", post(server));
  1. 验证版本兼容性:确保你的axum和tower-http(CorsLayer来自这个 crate)是最新兼容版本,旧版本可能存在预检请求处理的bug。

  2. 备选方案(如果上述方法无效):显式为/api路由添加OPTIONS方法的空处理,让路由能匹配到OPTIONS请求,再交给CorsLayer处理:

let app = Router::new()
    .layer(CorsLayer::permissive())
    .layer(TraceLayer::new_for_http())
    .route("/api", post(server).options(|| async { Ok(()) }));

原理说明:

Axum的中间件是按添加顺序执行的,先添加的中间件会先接收请求。如果TraceLayer在CorsLayer前面,OPTIONS请求会先经过TraceLayer,然后进入路由匹配——但你的路由只定义了POST方法,所以Axum直接返回405 Method Not Allowed,此时CorsLayer还没机会处理这个请求。把CorsLayer移到最前面后,它会拦截OPTIONS预检请求,直接返回符合CORS规则的响应,不会走到路由匹配环节。

内容的提问来源于stack exchange,提问作者Alister Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 02:54:37