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

Posted

技术标签:

【中文标题】gorilla mux 在使用变量时为静态文件设置了错误的路径【英文标题】:gorilla mux sets wrong path for static files when using variables 【发布时间】:2020-04-27 09:59:10 【问题描述】:

我设置了以下路由:

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 不应该存在。我该如何解决这个问题?

【问题讨论】:

哦,天哪,因为树木,我看不到森林。非常感谢,@mkopriva。请将其添加为答案,以便我接受。 【参考方案1】:
The resource "http://server/bar/ui/static/css/style.css" has been blocked due to mime type mismatch

“mime 类型不匹配”错误有时是由于找不到文件而浏览器接收到一些默认响应,其正文包含 not css 但可能只是一些纯文本或 html大多数。

如果你看一下导致错误的路径:

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

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

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

你会看到浏览器在错误的地方寻找文件,如果你认为这个特定的错误是在你在/bar时发生的,你可以推断问题是由相关链接引起的/bar 处理程序提供的 html(和/或由 html 正确链接的静态文件)。

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


当我调用 URL http://server/foo 时,一切都很好。

注意/foo似乎是在POST方法下注册的,这样的端点不会导致浏览器发出对静态文件的后续请求,就像html返回GET端点一样,因此它没有失败的理由出现静态文件“mime 类型不匹配”错误。

【讨论】:

以上是关于gorilla mux 在使用变量时为静态文件设置了错误的路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gorilla/mux 包中初始化 HandleFunc 中的变量

如何在 Gorilla mux 路由中获取 OR 模式

对使用 gorilla/mux URL 参数的函数进行单元测试

Gorilla Mux 和 GORM 失败

如何组织 gorilla mux 路线?

Go:使用 gorilla mux 提供 CSS 文件