2

我希望 Warp 为当前工作目录提供服务。这是整个main.rs

#[tokio::main]
async fn main() {
    let current_dir = std::env::current_dir().expect("failed to read current directory");
    warp::serve(warp::fs::dir(current_dir))
        .run(([127, 0, 0, 1], 3030))
        .await;
}

具有以下依赖项:

[dependencies]
tokio = { version = "1.5", features = ["full"] }
warp = "0.3"

www然后我在具有以下结构的目录上运行它:

www
├── foo
|   └── index.html
|   └── style.css
└── bar
    └── index.html
    └── style.css

提供 HTML 页面,但不提供其引用的 CSS 文件。HTML 页面使用它们各自的 CSS 文件<link rel="stylesheet" href="style.css">

我使用 node.js express 进行此工作,但使用 Warp 它尝试加载www/style.css,而不是www/foo/style.cssand www/bar/style.css

如果我将 href 更改为"foo/style.css"and ,它会起作用"bar/style.css",但如果可能的话,我想避免这种情况。我可以在 Warp 端改变什么来解决这个问题吗?

编辑:我了解到,如果 URL 包含尾部斜杠,则页面会正确呈现 CSS。

所以这不起作用:

http://localhost:3030/foo
http://localhost:3030/bar

但这确实:

http://localhost:3030/foo/
http://localhost:3030/bar/
4

1 回答 1

1

感谢@Kitsu 对类似问题的评论,我了解到这目前是一个未解决的问题

我最终使用了该讨论中kolektiv 解决方案的略微修改版本。它使用 获取路径warp::path::full(),然后在需要时使用尾部斜杠重定向。这是我的示例所期望的代码。

cargo.toml的依赖:

[dependencies]
tokio = { version = "1.5", features = ["full"] }
warp = "0.3"

main.rs

use std::str::FromStr;
use warp::{filters::BoxedFilter, http::Uri, path::FullPath, redirect, Filter, Reply};

#[tokio::main]
async fn main() {
    let current_dir = std::env::current_dir().expect("failed to read current directory");

    let routes = root_redirect().or(warp::fs::dir(current_dir));

    warp::serve(routes).run(([127, 0, 0, 1], 3030)).await;
}

fn root_redirect() -> BoxedFilter<(impl Reply,)> {
    warp::path::full()
        .and_then(move |path: FullPath| async move {
            let path = path.as_str();

            // do not redirect if the path ends in a trailing slash
            // or contains a period (indicating a specific file, e.g. style.css)
            if path.ends_with("/") || path.contains(".") {
                return Err(warp::reject());
            }

            Ok(redirect::redirect(
                Uri::from_str(&[path, "/"].concat()).unwrap(),
            ))
        })
        .boxed()
}
于 2021-07-20T12:33:47.410 回答