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
相关产品推荐
相关产品推荐

