【问题标题】:Routes returning 404 for mux gorilla为 mux gorilla 返回 404 的路线
【发布时间】:2015-03-03 20:24:47
【问题描述】:

在我的 Go 应用程序中,我使用的是 gorilla/mux。

我想要

http://host:3000/ 从子目录“frontend”静态提供文件 http://host:3000/api/ 及其子路径由指定的函数提供服务。

使用以下代码,这两个调用都不起作用。 /index.html 是唯一没有的(但不是它正在加载的资源)。我做错了什么?

package main

import (
  "log"
  "net/http"
  "fmt"
  "strconv"
  "github.com/gorilla/mux"
)

func main() {
  routineQuit := make(chan int)

  router := mux.NewRouter().StrictSlash(true)
  router.PathPrefix("/").Handler(http.FileServer(http.Dir("./frontend/")))
  router.HandleFunc("/api", Index)
  router.HandleFunc("/api/abc", AbcIndex)
  router.HandleFunc("/api/abc/{id}", AbcShow)
  http.Handle("/", router)
  http.ListenAndServe(":" + strconv.Itoa(3000), router)

  <- routineQuit
}

func Abc(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintln(w, "Index!")
}

func AbcIndex(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintln(w, "Todo Index!")
}

func AbcShow(w http.ResponseWriter, r *http.Request) {
  vars := mux.Vars(r)
  todoId := vars["todoId"]
  fmt.Fprintln(w, "Todo show:", todoId)
}

【问题讨论】:

    标签: http go


    【解决方案1】:

    Gorilla 的多路复用路由按照添加顺序进行评估。因此,使用第一个匹配请求的路由。

    在您的情况下,/ 处理程序将匹配每个传入请求,然后在 frontend/ 目录中查找文件,然后显示 404 错误。您只需要交换路线顺序即可使其运行:

    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/api/abc/{id}", AbcShow)
    router.HandleFunc("/api/abc", AbcIndex)
    router.HandleFunc("/api", Abc)
    router.PathPrefix("/").Handler(http.FileServer(http.Dir("./frontend/")))
    http.Handle("/", router)
    

    【讨论】:

    • 这救了我!在各种 SO 线程之后敲打我的头,想知道发生了什么。谢谢
    最近更新 更多