使用Go / Negroni / Gorilla Mux从静态URL提供文件

时间:2015-04-03 23:53:45

标签: go gorilla negroni

所以我是Go的新手并尝试构建一个简单的Web服务器。我遇到麻烦的一个部分是我想用动态静态URL提供静态文件(以便通过浏览器启用长缓存)。例如,我可能有这个网址:

/static/876dsf5g87s6df5gs876df5g/application.js

但我想提供位于以下位置的文件:

/build/application.js

我如何使用Go / Negroni / Gorilla Mux进行此操作?

2 个答案:

答案 0 :(得分:3)

你是否已经决定如何记录/坚持"随机"网址的一部分? D B?在内存中(即没有重启)?如果没有,crypto/sha1启动时的文件,并将结果SHA-1哈希存储在地图/切片中。

否则,像(假设大猩猩)r.Handle("/static/{cache_id}/{filename}", YourFileHandler)这样的路线会起作用。

package main

import (
    "log"
    "mime"
    "net/http"
    "path/filepath"

    "github.com/gorilla/mux"
)

func FileServer(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    id := vars["cache_id"]

    // Logging for the example
    log.Println(id)

    // Check if the id is valid, else 404, 301 to the new URL, etc - goes here!
    // (this is where you'd look up the SHA-1 hash)

    // Assuming it's valid
    file := vars["filename"]

    // Logging for the example
    log.Println(file)

    // Super simple. Doesn't set any cache headers, check existence, avoid race conditions, etc.
    w.Header().Set("Content-Type", mime.TypeByExtension(filepath.Ext(file)))
    http.ServeFile(w, r, "/Users/matt/Desktop/"+file)
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello!\n"))
}

func main() {

    r := mux.NewRouter()

    r.HandleFunc("/", IndexHandler)
    r.HandleFunc("/static/{cache_id}/{filename}", FileServer)

    log.Fatal(http.ListenAndServe(":4000", r))
}

这应该是开箱即用的,但我不能保证它的生产准备就绪。就个人而言,我只是使用nginx来提供我的静态文件,并从它的文件处理程序缓存,实体gzip实现等等中受益。

答案 1 :(得分:1)

我知道为时已晚,但也许我的回答也会对某人有所帮助。我找到了一个go-staticfiles库,该库通过在文件名上添加哈希来实现静态文件缓存和版本控制。因此,可以为资产文件设置长时间缓存,并且当它们更改时立即获得新副本。同样,很容易实现模板功能,以将静态文件{{static "css/style.css"}}的链接转换为真实路径/static/css/style.d41d8cd98f00b204e9800998ecf8427e.css。在README

中阅读更多示例