所以我是第一次尝试用它来构建一个简单的web服务器。我遇到的一个问题是,我希望使用动态静态urls (通过浏览器启用长缓存)为静态文件提供服务。例如,我可能有这个网址:
/static/876dsf5g87s6df5gs876df5g/application.js
但我想提供的文件位于:
/build/application.js
我该如何与围棋/内格罗尼/大猩猩穆克斯合作?
发布于 2015-04-04 06:39:44
您是否已决定如何记录/持久化URL的“随机”部分?DB?在内存中(即不跨重启动)?如果没有,则在启动时对文件进行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实现等方面获益。
https://stackoverflow.com/questions/29441239
复制相似问题