解決golang http.FileServer 遇到的坑
上次寫了一個2行實現(xiàn)一個靜態(tài)服務器的文章
今天群里有個哥們是這么寫居然返回的是404 見鬼了嘛??
http.handle("/js", http.FileServer(http.Dir("js"))
http.ListenAndServe("8080", nil)
大概的意思就是綁定 路由為 js 的時候訪問這個js 文件夾 看了一下確實代碼上面沒什么毛病。但是路徑怎么修改 也不好使。
我把代碼拿到我的 電腦上面運行 shitfuck 這是搞什么啊居然出現(xiàn)下面的這個情況
奇怪居然在我電腦上面也不能執(zhí)行了。莫非我的文件夾權(quán)限有問題
給賦值一下 777 權(quán)限 重新運行
居然還不好使。來回改路徑 就這么搗鼓了兩個小時無意中看到一個文章就是說的這個
加一個StripPrefix 方法就好了
那這個玩意是干嘛的呢??纯词謨?/p>
然后我的代碼就變成這個樣子
http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("js"))))
http.StripPrefix用于過濾request,參數(shù)里的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目錄下的內(nèi)容" 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("訪問靜態(tài)文件:%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", "/client", 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) } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
GoAdminGroup/go-admin的安裝和運行的教程詳解
這篇文章主要介紹了GoAdminGroup/go-admin的安裝和運行的教程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Golang判斷struct/slice/map是否相等以及對比的方法總結(jié)
平時開發(fā)中對比兩個struct或者map、slice是否相等是經(jīng)常遇到的,有很多對比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等也是經(jīng)常容易混淆的,這么多種對比方式,適用場景和優(yōu)缺點都有哪些呢?今天我們來具體總結(jié)一下,感興趣的小伙伴們可以參考借鑒2022-11-11解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG
這篇文章主要介紹了解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12golang值類型轉(zhuǎn)換成[]uint8類型的操作
這篇文章主要介紹了golang值類型轉(zhuǎn)換成[]uint8類型的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05golang?channel多協(xié)程通信常用方法底層原理全面解析
channel?是?goroutine?與?goroutine?之間通信的重要橋梁,借助?channel,我們能很輕易的寫出一個多協(xié)程通信程序,今天,我們就來看看這個?channel?的常用用法以及底層原理2023-09-09Go中g(shù)in框架的*gin.Context參數(shù)常見實用方法
*gin.Context是處理HTTP請求的核心,ctx代表"context"(上下文),它包含了處理請求所需的所有信息和方法,例如請求數(shù)據(jù)、響應構(gòu)建器、路由參數(shù)等,這篇文章主要介紹了Go中g(shù)in框架的*gin.Context參數(shù)常見實用方法,需要的朋友可以參考下2024-07-07