文件服务器 returns 所有文件 404
Fileserver returns 404 for all files
因此,每当我尝试访问我的静态子目录中的任何文件时,我只会收到 404,未找到,另一方面访问 Home/ 工作正常,但是我从 home 文件调用的图片简直坏了:(,所以我想知道要更改什么,以便我可以同时提供文件和重定向我的根目录。
我的路径结构:
root/
->html
->static
->entry.go
我在这里看到了其他线程,他们都建议我做 r.PathPrefix("/").Handler(...),但是这样做可以访问静态之外的任何文件 returns NIL,包括我的 html 文件,它们位于我项目根目录中的单独 html 文件中,此外,重定向到其中任何一个 returns 404,未找到。
代码如下:
package main
import (
"fmt"
"net/http"
"html/template"
"github.com/gorilla/mux"
"os"
)
func IfError(err error, quit bool) {
if err != nil {
fmt.Println(err.Error())
if(quit) {
os.Exit(1);
}
}
}
func NotFound(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
t, _ := template.ParseFiles("html/404")
err := t.Execute(w, nil)
IfError(err, false)
}
func Home(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("html/home")
err := t.Execute(w, nil)
IfError(err, false)
}
func RedirectRoot(servefile http.Handler) http.Handler {
return http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
redirect := r.URL.Host+"/home"
http.Redirect(w, r, redirect, http.StatusSeeOther)
} else {
servefile.ServeHTTP(w, r)
}
})
}
func main() {
r := mux.NewRouter()
ServeFiles := http.StripPrefix("/", http.FileServer(http.Dir("static/")))
r.Handle("/", RedirectRoot(ServeFiles))
r.HandleFunc("/home", Home)
r.NotFoundHandler = http.HandlerFunc(NotFound)
fmt.Printf("Listening ...")
IfError(http.ListenAndServe(":8081", r), true)
}
非常感谢
我在你的代码中看到的问题
r.Handle("/", RedirectRoot(ServeFiles))
它会匹配每条路由,可能会产生意想不到的结果。而是清楚明确地映射您的路线,然后它会按您预期的那样工作。
例如: 让我们将处理程序映射为职责。此方法基于您的目录结构。
它只会通过文件服务器公开static
目录,其余文件和根目录是安全的。
func main() {
r := mux.NewRouter()
r.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
r.HandleFunc("/home", Home)
r.NotFoundHandler = http.HandlerFunc(NotFound)
fmt.Printf("Listening ...")
IfError(http.ListenAndServe(":8081", r), true)
}
RedirectRoot
可能不需要您的目的。
现在,/static/*
由 http.FileServer
服务,/home
由 Home
处理。
编辑:
如评论中所问。要将根 /
映射到主处理程序和 /favicon.ico
,请在上面的代码片段中添加以下内容。
func favIcon(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "static/favicon.ico")
}
r.HandleFunc("/favicon.ico", favIcon)
r.HandleFunc("/", Home)
favicon.ico
从 static
目录提供。
因此,每当我尝试访问我的静态子目录中的任何文件时,我只会收到 404,未找到,另一方面访问 Home/ 工作正常,但是我从 home 文件调用的图片简直坏了:(,所以我想知道要更改什么,以便我可以同时提供文件和重定向我的根目录。
我的路径结构:
root/
->html
->static
->entry.go
我在这里看到了其他线程,他们都建议我做 r.PathPrefix("/").Handler(...),但是这样做可以访问静态之外的任何文件 returns NIL,包括我的 html 文件,它们位于我项目根目录中的单独 html 文件中,此外,重定向到其中任何一个 returns 404,未找到。
代码如下:
package main
import (
"fmt"
"net/http"
"html/template"
"github.com/gorilla/mux"
"os"
)
func IfError(err error, quit bool) {
if err != nil {
fmt.Println(err.Error())
if(quit) {
os.Exit(1);
}
}
}
func NotFound(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
t, _ := template.ParseFiles("html/404")
err := t.Execute(w, nil)
IfError(err, false)
}
func Home(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("html/home")
err := t.Execute(w, nil)
IfError(err, false)
}
func RedirectRoot(servefile http.Handler) http.Handler {
return http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
redirect := r.URL.Host+"/home"
http.Redirect(w, r, redirect, http.StatusSeeOther)
} else {
servefile.ServeHTTP(w, r)
}
})
}
func main() {
r := mux.NewRouter()
ServeFiles := http.StripPrefix("/", http.FileServer(http.Dir("static/")))
r.Handle("/", RedirectRoot(ServeFiles))
r.HandleFunc("/home", Home)
r.NotFoundHandler = http.HandlerFunc(NotFound)
fmt.Printf("Listening ...")
IfError(http.ListenAndServe(":8081", r), true)
}
非常感谢
我在你的代码中看到的问题
r.Handle("/", RedirectRoot(ServeFiles))
它会匹配每条路由,可能会产生意想不到的结果。而是清楚明确地映射您的路线,然后它会按您预期的那样工作。
例如: 让我们将处理程序映射为职责。此方法基于您的目录结构。
它只会通过文件服务器公开static
目录,其余文件和根目录是安全的。
func main() {
r := mux.NewRouter()
r.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
r.HandleFunc("/home", Home)
r.NotFoundHandler = http.HandlerFunc(NotFound)
fmt.Printf("Listening ...")
IfError(http.ListenAndServe(":8081", r), true)
}
RedirectRoot
可能不需要您的目的。
现在,/static/*
由 http.FileServer
服务,/home
由 Home
处理。
编辑:
如评论中所问。要将根 /
映射到主处理程序和 /favicon.ico
,请在上面的代码片段中添加以下内容。
func favIcon(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "static/favicon.ico")
}
r.HandleFunc("/favicon.ico", favIcon)
r.HandleFunc("/", Home)
favicon.ico
从 static
目录提供。