1. 程式人生 > 程式設計 >解決golang http.FileServer 遇到的坑

解決golang http.FileServer 遇到的坑

上次寫了一個2行實現一個靜態伺服器的文章

今天群裡有個哥們是這麼寫居然返回的是404 見鬼了嘛??

http.handle("/js",http.FileServer(http.Dir("js"))

http.ListenAndServe("8080",nil)

大概的意思就是繫結 路由為 js 的時候訪問這個js 資料夾 看了一下確實程式碼上面沒什麼毛病。但是路徑怎麼修改 也不好使。

我把程式碼拿到我的 電腦上面執行 shitfuck 這是搞什麼啊居然出現下面的這個情況

解決golang http.FileServer 遇到的坑

奇怪居然在我電腦上面也不能執行了。莫非我的資料夾許可權有問題

給賦值一下 777 許可權 重新執行

居然還不好使。來回改路徑 就這麼搗鼓了兩個小時無意中看到一個文章就是說的這個

加一個StripPrefix 方法就好了

那這個玩意是幹嘛的呢。看看手冊

解決golang http.FileServer 遇到的坑

然後我的程式碼就變成這個樣子

http.Handle("/js/",http.StripPrefix("/js/",http.FileServer(http.Dir("js"))))

http.StripPrefix用於過濾request,引數裡的handler的request過濾掉特定的前序,只有這樣,才能正確顯示檔案目錄。 shitfuck

看一下我的路徑 以及下面存放的檔案

解決golang http.FileServer 遇到的坑

修改程式碼完成後就這麼神奇般的解決了

解決golang http.FileServer 遇到的坑

浪費了兩個小時不過 還不錯最起碼解決問題了。

補充: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)
  }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。