http.FileServer 只投放 index.html
http.FileServer only serves index.html
我的简单文件服务器代码:
package main
import (
"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.go
web/index.html
web/favicon.ico
web/favicon.png
web/css/main.css
index.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 0
127.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
?
为了证明这不起作用的原因,请考虑以下测试应用程序:
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;我假设您将使用它来添加一些其他路由,所以我将其保留。
我的简单文件服务器代码:
package main
import (
"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.go
web/index.html
web/favicon.ico
web/favicon.png
web/css/main.css
index.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 0
127.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
?
为了证明这不起作用的原因,请考虑以下测试应用程序:
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;我假设您将使用它来添加一些其他路由,所以我将其保留。