未找到Golang gorilla mux处理程序并不正确

时间:2016-01-28 19:01:29

标签: go http-status-code-404 gorilla mux

我正在写一个Web服务器而且我找不到Handler功能。 所有Handle功能,如登录,注册,查看页面都正常工作。 我也有这样一句话:router.NotFoundHandler = http.HandlerFunc(Handlers.NotFoundHandler) 处理程序是我的包,包括下一个代码:

func NotFoundHandler(w http.ResponseWriter, r *http.Request) {
    //title has to be 404.html
    title := config.Page404
    title = config.WebAppex + title

    fmt.Println("title: " + title)

    /*HERE IS QUESTION LINE*/
    r = http.NewRequest("GET", config.Page404, nil)

    fmt.Println(r.URL.Path)

    logger.Info("Sending... ", title)

    //load page
    p, err := loadPage(title)
    if err != nil {
        logger.Error("ERROR : ", err.Error())
        p, _ := loadPage(config.Page404)
        fmt.Fprintf(w, "%s", p.body) //wired way to send HTML page
        return                       //just return because of printing dry p.body
    }

    //serve it
    http.ServeFile(w, r, p.dir)
    logger.Info(p.dir, " has been sent")
}

所以问题是:如果我尝试去localhost:8080 /什么,那么我得到了我很好的Page404 但是如果我去localhost:8080 / nothing / nothing或localhost:8080 / nothing / nothing / nothing等等,我没有任何CSS就干了404.html。所以我认为这个问题是请求,所以我用" /404.html"的方式创建了新的问题。 (它的config.Page404),但没有任何改变。我读了关于gorilla mux Subrouter,bit它可能有助于排除localhost:8080 / nothing,但我需要所有的情况。那么有没有办法排除所有不存在的页面?

UPD:我的loadPage函数:

func loadPage(title string) (*page, error) {
    logger.Info("Trying to load", title)
    //writing from title to body
    body, err := ioutil.ReadFile(title)
    if err != nil {
        return nil, err
    }

    return &page{dir: config.HOMEDIR + title, body: body}, nil
}

type page struct {
    dir  string
    body []byte
}

谢谢!

1 个答案:

答案 0 :(得分:0)

您可能正在使用相对CSS样式表路径为404页面提供服务,当从/nothing/nothing/nothing等嵌套页面提供服务时,这显然会失败。

使用<base>标记在任何地方获取绝对链接,或将请求重定向到所需页面。