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

时间:2013-10-08 18:56:37

标签: http rest go

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

"returns a handler that serves HTTP requests with the contents of the file system rooted at root."

说我正在发布包含staticindex.html文件夹的scripts文件夹,其中包含一些javascript个文件。

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

1 个答案:

答案 0 :(得分:6)

您可以轻松地限制FileServerHttpHandler,其中包含另一个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.FileSystem接受http.FileServer接口。 它检查输入文件名是否与提供的模式匹配,然后将控制权交给原始http.Dir。这可能就是你想去的地方。