使用Rust的Warp库提供静态文件时出现404问题求助
解决Warp静态文件服务返回404的问题
我来帮你搞定这个404的问题!核心原因是你代码里的静态文件路径写错了,咱们一步步来修正:
问题分析
你的代码里写的是绝对路径/www/static,这个路径指向的是系统根目录下的www/static文件夹,但你的实际静态文件放在项目的src/www/static里。当你运行cargo run时,程序的工作目录是项目根目录(也就是src文件夹的上级目录),所以绝对路径完全匹配不上,自然返回404。
修正方案
有两种可靠的方式来修复路径问题:
方案1:使用项目根目录的相对路径
直接用相对路径指向静态文件所在的位置,代码修改如下:
use serde::Deserialize; use serde::Serialize; use warp::path; use warp::Filter; #[tokio::main] async fn main() { // 指向项目根目录下的src/www/static let static_assets = warp::path("static").and(warp::fs::dir("./src/www/static")); let routes = static_assets; warp::serve(routes).run(([127, 0, 0, 1], 3030)).await; }
方案2:使用CARGO_MANIFEST_DIR(更鲁棒)
如果担心运行程序时的工作目录变化,可以用Rust提供的env!("CARGO_MANIFEST_DIR")宏,它会自动获取项目的根目录路径,这样不管在哪里运行程序都能正确找到文件:
use serde::Deserialize; use serde::Serialize; use warp::path; use warp::Filter; use std::path::Path; #[tokio::main] async fn main() { // 拼接项目根目录和静态文件路径 let static_dir = Path::new(env!("CARGO_MANIFEST_DIR")) .join("src") .join("www") .join("static"); let static_assets = warp::path("static").and(warp::fs::dir(static_dir)); let routes = static_assets; warp::serve(routes).run(([127, 0, 0, 1], 3030)).await; }
验证
修改代码后运行cargo run,再访问localhost:3030/static/index.js,就能正常获取到你的静态文件啦!
内容的提问来源于stack exchange,提问作者kumarmo2
相关产品推荐
相关产品推荐

