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

Rust-Axum无法获取请求头x-api-key问题求助

问题原因及解决方案

核心问题:CORS配置未允许OPTIONS预检请求

当前端发送带自定义请求头(如x-api-key)的跨域GET请求时,浏览器会自动先发OPTIONS预检请求,确认服务器是否允许该自定义头和请求方法。你的CORS配置仅允许GET方法,未包含OPTIONS,导致预检请求失败,浏览器直接拦截后续实际GET请求,或未携带自定义头。

修复步骤

1. 更新CORS配置,添加OPTIONS方法

修改Rust代码中CorsLayer的配置,加入OPTIONS方法支持:

let cors = CorsLayer::new()
    .allow_origin(Any)
    .allow_methods([Method::GET, Method::OPTIONS]) // 添加OPTIONS方法
    .allow_headers(Any);

若业务允许,也可直接允许所有方法:

.allow_methods(Any)

2. 验证后端逻辑是否正常

用curl直接测试后端,排除前端侧问题:

curl -H "x-api-key: Test" http://127.0.0.1:8000/

如果后端能打印出x-api-key的值,说明后端逻辑无问题,问题确实出在CORS预检环节。

3. 额外检查点

  • 确认前端处于跨域环境(比如前端端口3000、后端8000),同域请求不会触发预检,若为同域仍有问题,可检查Axios是否被其他拦截器修改了请求头。
  • 在Axios请求前打印config.headers,确认x-api-key确实被正确设置。

修复后的完整Rust代码示例

fn app() -> Router<Arc<AppState>> {
    let cors = CorsLayer::new()
        .allow_origin(Any)
        .allow_methods([Method::GET, Method::OPTIONS])
        .allow_headers(Any);

    Router::new()
        .route("/", get(handler))
        .layer(cors)
        .layer(middleware::from_fn(auth_middleware))
}

async fn auth_middleware(req: Request, next: Next) -> Response {
    if let Some(api_key) = req.headers().get("x-api-key") {
        println!("{:?}", api_key);

        if api_key == "Test" {
            return next.run(req).await;
        }
    }

    (StatusCode::UNAUTHORIZED, "Unauthorized").into_response()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:55:56