http - 使用文件服务器为我的单个 html 页面提供服务

标签 http rest go

我正在尝试构建一个演示 的示例 Web 应用程序使用 的技巧在后端,服务 基于请求和 , 在前端(我没有使用 html/template 包)。

FileServer “返回一个处理程序,该处理程序使用以根为根的文件系统的内容为 HTTP 请求提供服务。”

假设我正在发布我的 static 文件夹,其中包含 index.htmlscripts 文件夹,其中包含一些 javascript 文件。

如何防止客户端查看我的 js 文件(仅在 / 发布 index.html)?

最佳答案

您可以轻松地限制 FileServer,它是一个 HttpHandler,方法是在其周围包装另一个 HttpHandler。例如,使用这个只允许提供 *.js 文件的包装器:

func GlobFilterHandler(h http.Handler, pattern string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        path := r.URL.Path

        fileName := filepath.Base(path)

        if ok, err := filepath.Match(pattern, fileName); !ok || err != nil {
            if err != nil {
                log.Println("Error in pattern match:", err)
            }

            http.NotFound(w, r)
            return
        }

        h.ServeHTTP(w, r)
    })
}

func main() {
    fileHandler := http.FileServer(http.Dir("/tmp/dtest"))
    wrappedHandler := GlobFilterHandler(fileHandler, "*.js")
}

你可以找到一篇博文here很好地描述了基本思想。

您的另一个选择是扩展 http.Dir 并制作您自己的 http.FileSystem 实现,它完全符合您的要求:

type GlobDir struct {
    Dir     http.Dir
    Pattern string
}

func (d GlobDir) Open(name string) (http.File, error) {
    baseName := filepath.Base(name)

    if ok, err := filepath.Match(d.Pattern, baseName); !ok || err != nil {
        if err != nil {
            return nil, err
        }
        return nil, fmt.Errorf("%s not match GlobDir pattern.", baseName)
    }

    return d.Dir.Open(name)
}

func main() {
    fileHandler := http.FileServer(GlobDir{
        Dir: http.Dir("/tmp/dtest"),
        Pattern: "*.js",
    })

    http.ListenAndServe(":8080", fileHandler)
}

第二个解决方案实现了被http.FileServer 接受的http.FileSystem 接口(interface)。 它检查输入文件名是否与提供的模式匹配,然后将控制权交给原始的 http.Dir。这可能是您想要前往此处的方式。

关于http - 使用文件服务器为我的单个 html 页面提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255978/

相关文章:

http - 如何从 curl 获取 http 请求?

http - 自签名代理客户端

php - 在 PHP 中以 RESTful 方式上传文件

Golang CircleCI 2.0 测试失败,信号为 : killed

gorm db.find(&users) 在 golang 中用 gin 转换为 json

go - 在我的 golang 可变参数函数中处理参数的更好方法

javascript - 基本 "Raw"Ajax 调用

java - HTTP 查询参数和 HTTP 表单参数之间的区别?

java - 如何等到服务器上线才能访问 REST API

c# - WCF JSON POST 请求,单个字符串参数未绑定(bind)并返回 400