【发布时间】:2020-12-22 19:57:06
【问题描述】:
上下文
我已经通过 Vapor (v4) 成功地提供文件:
func configure(_ app: Application) throws {
// ...
app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
// ...
}
问题
- 这会尝试映射任何/每个与 publicDirectory 中的文件匹配的 URL。
- 如何将
FileMiddleware的“范围”限制为仅请求其URL 具有特定前缀的请求? (比如/files/)
如果我有/Public/foobar.txt,则可以通过GET /files/foobar.txt 请求它,而GET /foobar.txt 不会匹配任何内容。
考虑的方法
- 我的理解是
Middleware应用于服务器范围(影响每个“路由”)而不是子集......所以这不起作用。 - 将
/Public/foobar.txt移动到/Public/files/foobar.txt不是解决方案,因为我试图限制可能映射到文件系统的 URL... - 将
GET /files/foobar.txt重定向到GET /foobar.txt也是不可接受的。同样,我需要限制映射到文件系统的潜在 URL。
【问题讨论】:
-
您可以将中间件应用于具有路由组的路由子集。所以你可以先做
let filesRoutes = app.grouped("files")然后是filesRoutes.grouped(FileMiddleware(...))` - 如果我不知道这行得通,值得一试! -
@0xTim,我一直在尝试相同的建议,但似乎无法像其他中间件一样对 FileMiddleware 进行分组。
-
FileMiddleware仅用于调试。您不应该将其用于生产。对于生产,您应该配置 nginx 来提供静态文件。