You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plumber API同时实现根路由静态文件与子路由接口挂载

解决Plumber同时挂载静态文件与接口端点的404问题

你遇到的问题是因为静态资源挂载到根路径/后,Plumber的路由匹配优先级导致/test请求被静态资源路由拦截,无法到达接口端点。当你把静态资源挂载到根路径时,所有根路径下的请求都会先经过这个静态资源路由,它会尝试在指定目录中查找对应文件,找不到就直接返回404,不会继续匹配后续的接口路由。

以下是两种可行的解决方案:

方案一:调整静态资源挂载路径,单独处理根路径返回index.html

这种方式将静态资源移到子路径,根路径单独返回首页文件,避免和接口路由冲突。

  1. 修改init.R:
library(plumber)

options(plumber.trailingSlash = TRUE)

pr <- Plumber$new()

# 根路径返回index.html
pr <- pr %>%
  pr_get("/", function(res) {
    res$headers$`Content-Type` <- "text/html"
    readLines("api/assets/index.html", warn = FALSE)
  }) %>%
  # 静态资源挂载到/assets路径
  pr_mount("/assets", plumb("api/assets.R")) %>%
  pr_mount("/test", plumb("api/test.R"))

pr_run(pr, host = "0.0.0.0", port = 8080)
  1. 保持api/assets.R不变:
#* Assets for front end
#* @assets api/assets /
list()

这样访问http://localhost:8080会返回index.html,静态资源(如css、js)可以通过/assets/xxx访问,/test接口正常返回数据。

方案二:使用pr_static并调整挂载顺序

pr_static是Plumber提供的更简洁的静态资源托管方式,通过调整挂载顺序让接口路由优先匹配。

修改init.R即可,无需api/assets.R文件:

library(plumber)

options(plumber.trailingSlash = TRUE)

pr <- Plumber$new()

# 先挂载接口端点,再添加静态资源路由
pr <- pr %>%
  pr_mount("/test", plumb("api/test.R")) %>%
  pr_static("/", "api/assets") # 静态资源托管到根路径

pr_run(pr, host = "0.0.0.0", port = 8080)

这种方式下,Plumber会先匹配已定义的/test接口,匹配失败后再去查找静态资源,既保留了根路径返回index.html的需求,也能让/test接口正常工作。

内容的提问来源于stack exchange,提问作者Scido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:09:31