gorilla mux 在使用变量时为静态文件设置了错误的路径

gorilla mux sets wrong path for static files when using variables

我设置了以下路由:

func (app *application) routes() *mux.Router {
    r := mux.NewRouter()
    fs := http.FileServer(http.Dir("./ui/static/"))
    r.PathPrefix("/ui/static/").Handler(http.StripPrefix("/ui/static/", fs))

    authRequired := r.PathPrefix("/").Subrouter()

    authRequired.HandleFunc("/foo", app.foo).Methods("POST") // <- this one works fine
    authRequired.HandleFunc("/bar/{id:[0-9]+}", app.bar) // <- this does not

    return r
}

当我调用 URL http://server/foo 时一切正常。
例如http://server/bar/1 网站已交付,但我收到类似

的错误消息
The resource "http://server/bar/ui/static/css/style.css" has been blocked due to mime type mismatch

http://server/bar/ui/static/... 中的 /bar 不应该存在。我该如何解决这个问题?

The resource "http://server/bar/ui/static/css/style.css" has been blocked due to mime type mismatch

"mime type mismatch" 错误有时是由于找不到文件和浏览器收到一些默认响应,其正文包含 not css 但可能只是一些纯文本,或者最多 html。

如果您查看导致错误的路径:

http://server/bar/ui/static/css/style.css

然后是您注册静态文件处理程序的路径:

r.PathPrefix("/ui/static/").Handler( ...

您会看到浏览器正在错误的位置查找文件,如果您认为此特定错误是在您打开 /bar 时发生的,则可以推断问题是由html 中的相对链接(and/or 由 html 正确链接的静态文件)由 /bar 处理程序提供服务。

因此解决方案是在静态文件和 html 文件中使用绝对路径。


When I call the URL http://server/foo everything is fine.

注意/foo好像是在POST方法下注册的,这样的端点不会导致浏览器发出后续的静态文件请求,比如html返回GET端点可能,因此它没有理由因静态文件 "mime type mismatch" 错误而失败。