2017-07-02 68 views
0

因此,無論何時我嘗試訪問我的靜態子目錄中的任何文件,我只會得到一個404,Not Found,Accessing Home /另一方面工作得很好,但是我打電話給我的圖片從主文件簡直是壞:(,所以我想知道要改變什麼,這樣我可以提供文件服務,並在同一時間重定向我的根目錄Fileserver對所有文件返回404

我的道路結構:

root/ 
->html 
->static 
->entry.go 

我看到這裏的其他線程,他們都建議我做r.PathPrefix(「/」)。Handler(...),但這樣做使得它訪問任何文件之外的靜態返回NIL,包括我的HTML文件在我的項目的根目錄中有一個單獨的html文件,而且,重定向到它們中的任何一個都會返回404,Not Found。

下面的代碼:

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) 
} 

非常感謝您

回答

0

我看到的問題在你的代碼

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/homeHome處理。


編輯:

由於要求在註釋。要將根/映射到主處理程序和/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.icostatic服務目錄。

+0

但我想我的根目錄重定向到home /,訪問網站與您的imlementation會給我一個404,未找到,並favicon.ico將不會加載 – Whiteclaws

+0

添加更多詳細信息的答案,請有看看。 – jeevatkm