为了账号安全,请及时绑定邮箱和手机立即绑定

http.FileServer 只服务于 index.html

http.FileServer 只服务于 index.html

Go
达令说 2022-04-26 15:26:56
我的简单文件服务器代码:package mainimport (    "net/http"    "os"    "github.com/gorilla/handlers"    "github.com/gorilla/mux")func main() {    r := mux.NewRouter()    // default file handler    r.Handle("/", http.FileServer(http.Dir("web")))    // run on port 8080    if err := http.ListenAndServe(":8080", handlers.LoggingHandler(os.Stdout, r)); err != nil {        panic(err)    }}我的目录结构是:cmd/server/main.goweb/index.htmlweb/favicon.icoweb/favicon.pngweb/css/main.cssindex.html要求main.css。所以当我运行时,go run cmd/server/main.go我得到以下输出:127.0.0.1 - - [24/Dec/2019:22:45:26 -0X00] "GET / HTTP/1.1" 304 0127.0.0.1 - - [24/Dec/2019:22:45:26 -0X00] "GET /css/main.css HTTP/1.1" 404 19我可以看到该index.html页面,但没有 CSS。当我请求任何其他文件(例如favicon.ico)时,我也会收到 404。为什么我的FileServer唯一服务index.html?
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

为了说明为什么这不起作用,请考虑以下测试应用程序:


package main


import (

    "fmt"

    "net/http"


    "github.com/gorilla/mux"

)


type testHandler struct{}


func (h *testHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    fmt.Printf("Got request for %s\n", r.URL)

}


func main() {

    r := mux.NewRouter()

    hndlr := testHandler{}

    r.Handle("/", &hndlr)


    // run on port 8080

    if err := http.ListenAndServe(":8080", r); err != nil {

        panic(err)

    }

}

如果您http://127.0.0.1:8080/在浏览器中运行并访问它,它将记录Got request for /. 但是,如果您访问 http://127.0.0.1:8080/foo,您将收到 404 错误,并且不会记录任何内容。这是因为r.Handle("/", &hndlr)只会匹配它,/而不是它下面的任何东西。


如果将其更改为r.PathPrefix("/").Handler(&hndlr),它将按预期工作(路由器会将所有路径传递给处理程序)。因此,要将您的示例更改r.Handle("/", http.FileServer(http.Dir("web")))为r.PathPrefix("/").Handler( http.FileServer(http.Dir("web"))).


注意:因为这是传递所有路径,FileServer所以实际上不需要使用 Gorilla Mux;假设您将使用它来添加其他一些路线,我将其保留。


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信