域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。
  • 方案1️⃣AXUM.RS 域名 = 3000
  • 方案2️⃣方案1️⃣ + 本站所有专题原始 Markdown 文档 = 5000
  • 方案3️⃣方案2️⃣ + 本站原始数据库 = 5500
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名(方案1️⃣),或者该域名到期,本站将启用新的免费域名继续提供服务。
  2. 如果有人购买了 AXUM.RS 域名,且同时购买了内容和/或数据库(方案2️⃣/方案3️⃣),本站将关闭。届时我们或许会以另一种方式与你再相遇。

axum处理静态文件

和其它 Web 框架一样,axum 也会对所有请求进行处理。对于 CSS、JS 及图片等静态文件,并不需要 axum 的 handler 进行处理,而是只需要简单的把它们的内容进行返回即可。axum 提供了处理静态文件的中间件。

使用 handler 处理

现在的问题是,我们如何才能在浏览器中访问到这个文件呢?按照它的目录,我们试试 /static/axum-rs.txt

$ curl -i 127.0.0.1:9527/static/axum-rs.txt
HTTP/1.1 404 Not Found
content-length: 0
date: Wed, 17 Nov 2021 09:16:51 GMT

可以发现,HTTP 的状态码是 404,即找不到该资源。为了解决这个问题,我们可以定义一个 handler:

async fn axum_rs_txt() -> String {
    std::fs::read_to_string("static/axum-rs.txt").unwrap()
}

然后定义路由:

let app = Router::new().route("/static/axum-rs.txt", axum::routing::get(axum_rs_txt));

访问试试:

$ curl -i 127.0.0.1:9527/static/axum-rs.txt
HTTP/1.1 200 OK
content-type: text/plain
content-length: 40
date: Wed, 17 Nov 2021 09:17:44 GMT

Welcome to axum.rs!
Email: [email protected]

很好,搞定了。问题是,如果有成千上万个静态资源要处理呢?这种方式显然不够好。

使用中间件处理

首先,加入 tower-http 依赖:

let app = Router::new().nest(
        "/static",
        service::get(ServeDir::new("static")).handle_error(|err| {
            (
                StatusCode::INTERNAL_SERVER_ERROR,
                format!("处理静态资源出错:{:?}", err),
            )
        }),
    );

解释一下:

  • /static:指定 URL 访问静态资源时的前缀,比如:/static/axum.rs

  • ServeDir::new("static"):指定静态文件存放在服务器上的路径

/static:指定 URL 访问静态资源时的前缀,比如:/static/axum.rs

ServeDir::new("static"):指定静态文件存放在服务器上的路径

有了这个中间件之后,所有静态资源放到static目录即可,不需要对代码进行改动了。

截止发稿为止,axum 官方最近的 git 提交中的“静态文件服务”的示例代码无法编译。

本章讨论了使用 axum 处理静态资源的方法,完整代码可以在代码库中找到。

要查看完整内容,请先登录