定义匹配磁盘文件的路由

Define route that matches file on disk

我试图通过将它们包装在模板中来装饰 public 目录中的一些文件。

示例文件系统结构:

project_root\
    file_i_want_to_decorate.html
    file_that_should_be_just_downloadable.zip

路由/{path*}刚抓取了所有的文件。不好。

所以我的想法是使用自定义匹配器:

type ContentRouteSegmentConstraint() =
    inherit RouteSegmentConstraintBase<string>()
    let root = Environment.GetEnvironmentVariable("PROJECT_ROOT")        
    override x.Name with get() = "content"
    override x.TryMatch(``constraint``, segment, matchedValue) =
        matchedValue <- segment
        File.Exist(segment)

并添加路线 /{path*:content}。好吧,它有效,但在某种程度上,只有第一段被传递给函数。而且即使用/index调用,动态字典中的参数"path"也是空的

这是不正确的做法。应该使用路由过滤函数代替段的匹配函数,如下所示:

Get["/{path*}", (fun (context) -> context.Request.Url.Path |> content.CanServe)] <- fun ...