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

使用Go/Negroni/Gorilla Mux从静态url提供文件,go,gorilla,negroni,Go,Gorilla,Negroni,所以我是新手,尝试构建一个简单的web服务器。我遇到的一个问题是,我希望使用动态静态URL为静态文件提供服务(以便通过浏览器实现长缓存)。例如,我可能有以下url: /static/876dsf5g87s6df5gs876df5g/application.js 但我想提供位于以下位置的文件: /build/application.js 我将如何使用go/Negroni/Gorilla Mux进行此操作?您是否已经决定如何记录/保留URL的“随机”部分?DB?内存中(即不跨重启)?如果没有,则启动

所以我是新手,尝试构建一个简单的web服务器。我遇到的一个问题是,我希望使用动态静态URL为静态文件提供服务(以便通过浏览器实现长缓存)。例如,我可能有以下url:

/static/876dsf5g87s6df5gs876df5g/application.js

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

/build/application.js


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

您是否已经决定如何记录/保留URL的“随机”部分?DB?内存中(即不跨重启)?如果没有,则启动时,
crypto/sha1
文件,并将生成的SHA-1哈希存储在映射/切片中

否则,类似(假设Gorilla)
r.Handle(“/static/{cache\u 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实现等中获益。

您已经决定如何记录/保存URL的“随机”部分了吗?DB?内存中(即不跨重启)?如果没有,则启动时,
crypto/sha1
文件,并将生成的SHA-1哈希存储在映射/切片中

否则,类似(假设Gorilla)
r.Handle(“/static/{cache\u 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实现等中获益。

我知道这已经太晚了,但也许我的答案也会对其他人有所帮助。我发现了一个库,它通过在文件名中添加散列来实现静态文件缓存和版本控制。因此,可以为资产文件设置长时间缓存,当它们发生更改时,可以立即获得新副本。另外,将链接转换为静态文件
{{static“css/style.css”}
到实际路径
/static/css/style.d41d8cd98f00b204e9800998ecf8427e.css
也很容易实现模板功能。阅读更多的例子,我知道为时已晚,但也许我的答案也能帮助别人。我发现了一个库,它通过在文件名中添加散列来实现静态文件缓存和版本控制。因此,可以为资产文件设置长时间缓存,当它们发生更改时,可以立即获得新副本。另外,将链接转换为静态文件
{{static“css/style.css”}
到实际路径
/static/css/style.d41d8cd98f00b204e9800998ecf8427e.css
也很容易实现模板功能。阅读

中的更多示例这就是我要找的。我调整了路由路径行,使其看起来像
myMux.HandleFunc(“/static/{cache\u id}/{filename:[a-zA-Z0-9\\.\\\\-\\\\\\\\\/]*},FileServer)
,这样is就能够处理像
/static/8s7df65g87sd6f5g/app/test.html这样的深层路径。我也同意,在生产中,我将通过nginx之类的东西为Go应用程序提供服务,nginx能够更好地处理这类事情,但是这个应用程序被设计成一个快速开发服务器(比pythonsimplehttpserver工作得更好)。谢谢。这就是我要找的。我调整了路由路径行,使其看起来像
myMux.HandleFunc(“/static/{cache\u id}/{filename:[a-zA-Z0-9\\.\\\\-\\\\\\\\\/]*},FileServer)
,这样is就能够处理像
/static/8s7df65g87sd6f5g/app/test.html这样的深层路径。我也同意,在生产中,我将通过nginx之类的东西为Go应用程序提供服务,nginx能够更好地处理这类事情,但是这个应用程序被设计成一个快速开发服务器(比pythonsimplehttpserver工作得更好)。谢谢