解決golang http.FileServer 遇到的坑
阿新 • • 發佈:2020-12-18
上次寫了一個2行實現一個靜態伺服器的文章
今天群裡有個哥們是這麼寫居然返回的是404 見鬼了嘛??
http.handle("/js",http.FileServer(http.Dir("js"))
http.ListenAndServe("8080",nil)
大概的意思就是繫結 路由為 js 的時候訪問這個js 資料夾 看了一下確實程式碼上面沒什麼毛病。但是路徑怎麼修改 也不好使。
我把程式碼拿到我的 電腦上面執行 shitfuck 這是搞什麼啊居然出現下面的這個情況
奇怪居然在我電腦上面也不能執行了。莫非我的資料夾許可權有問題
給賦值一下 777 許可權 重新執行
居然還不好使。來回改路徑 就這麼搗鼓了兩個小時無意中看到一個文章就是說的這個
加一個StripPrefix 方法就好了
那這個玩意是幹嘛的呢。看看手冊
然後我的程式碼就變成這個樣子
http.Handle("/js/",http.StripPrefix("/js/",http.FileServer(http.Dir("js"))))
http.StripPrefix用於過濾request,引數裡的handler的request過濾掉特定的前序,只有這樣,才能正確顯示檔案目錄。 shitfuck
看一下我的路徑 以及下面存放的檔案
修改程式碼完成後就這麼神奇般的解決了
浪費了兩個小時不過 還不錯最起碼解決問題了。
補充:Golang1.8標準庫http.Fileserver跟http.ServerFile小例子
我就廢話不多說了,大家還是直接看程式碼吧~
package main import ( "fmt" "net/http" "os" "path" "strings" ) var staticfs = http.FileServer(http.Dir("D:\\code\\20160902\\src\\")) func main() { //瀏覽器開啟的時候顯示的就是D:\\code\\20160902\\src\\client目錄下的內容" http.Handle("/client/",http.FileServer(http.Dir("D:\\code\\20160902\\src\\"))) http.HandleFunc("/static/",static) http.HandleFunc("/js/",js) http.HandleFunc("/",route) http.ListenAndServe(":1789",nil) } func route(w http.ResponseWriter,r *http.Request) { fmt.Println(r.URL) fmt.Fprintln(w,"welcome") r.Body.Close() } //這裡可以自行定義安全策略 func static(w http.ResponseWriter,r *http.Request) { fmt.Printf("訪問靜態檔案:%s\n",r.URL.Path) old := r.URL.Path r.URL.Path = strings.Replace(old,"/static","/client",1) staticfs.ServeHTTP(w,r) } //設定單檔案訪問,不能訪問目錄 func js(w http.ResponseWriter,r *http.Request) { fmt.Printf("不能訪問目錄:%s\n",r.URL.Path) old := r.URL.Path name := path.Clean("D:/code/20160902/src" + strings.Replace(old,"/js",1)) info,err := os.Lstat(name) if err == nil { if !info.IsDir() { http.ServeFile(w,r,name) } else { http.NotFound(w,r) } } else { http.NotFound(w,r) } }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。