Axum启用路由规范化时根路由/无法重定向
问题分析
你遇到的核心问题是:启用NormalizePathLayer并以外层包裹Router的方式配置时,根路径/的重定向逻辑无法触发,请求直接进入404 fallback。这是因为该层的包裹顺序干扰了Axum路由对根路径的匹配逻辑。
解决方案
调整NormalizePathLayer的添加方式,将其通过Router::layer()方法集成到路由栈中,而非外层包裹整个Router。
修改后的完整代码:
use axum::{ http::{header::HeaderMap, StatusCode}, response::{IntoResponse, Redirect}, routing::get, Router, ServiceExt, }; use std::net::SocketAddr; use tower_http::normalize_path::NormalizePathLayer; #[tokio::main] async fn main() { let addr = SocketAddr::from(([127, 0, 0, 1], 9090)); axum::Server::bind(&addr) .serve( Router::new() .route("/", get(redirect)) .fallback(handler_404) .layer(NormalizePathLayer::trim_trailing_slash()) .into_make_service(), ) .await .unwrap(); } async fn redirect(_headers: HeaderMap) -> Redirect { Redirect::temporary("/404") } async fn handler_404() -> impl IntoResponse { (StatusCode::NOT_FOUND, "nothing to see here") }
补充说明
- 调整后的配置中,
NormalizePathLayer会在请求进入路由匹配前完成路径规范化,同时保证根路径/的路由规则能正确匹配并触发重定向逻辑。 - 你的
Cargo.toml中存在无效依赖use = "0.0.0",建议移除该条目以避免编译警告。
内容的提问来源于stack exchange,提问作者Axum500
相关产品推荐
相关产品推荐

