以前編寫過一個Web路由轉發,能夠參考我以前的博客git
以前的版本具備不少問題,所前段時間一直很忙,在作個人新東西和實習,因此就一直沒更新github
今天忙裏偷閒,就更新一下Web路由json
主要解決的仍是多語言Web開發時,整合至一個端口的問題網站
固然除了這個功能,還有不少有趣的用法,好比網站鏡像,繞過備案等玩法spa
廢話不說直接上代碼3d
package main import( "log" "strings" "net/http" "io/ioutil" "encoding/json" "github.com/vulcand/oxy/forward" "github.com/vulcand/oxy/testutils" ) type Rule struct{ Domain string `json:Domain` Address string `json:Address` } type Setting struct{ MainPort string `json:MainPort` Rules []Rule `json:Rules` } var setting Setting var fwd *forward.Forwarder func redirectHandle(w http.ResponseWriter, r *http.Request){ address := getAddress(r.Host) if address != "" { r.URL = testutils.ParseURI("http://"+address) log.Println("Info: "+r.Host+" => "+address) fwd.ServeHTTP(w, r) } else { w.WriteHeader(500) } } func getAddress(host string) string { for _,v := range setting.Rules { if strings.Compare(host,v.Domain) == 0 { return v.Address } } return "" } func Init(){ var Data,err = ioutil.ReadFile("setting.json") if err != nil{ log.Fatal("Read Config File Error!") return } err = json.Unmarshal(Data,&setting) if err != nil{ log.Fatal("Read Config JSON Error!Please Check!") return } log.Println("Main Port: "+setting.MainPort) for i:=0;i<len(setting.Rules);i++{ log.Println("Import Rule: "+setting.Rules[i].Domain+" <----> "+setting.Rules[i].Address) } } func main(){ Init() fwd, _ = forward.New() redirect := http.HandlerFunc(redirectHandle) s := &http.Server{ Addr: ":"+setting.MainPort, Handler: redirect, } log.Println("Info: Listening port "+s.Addr) s.ListenAndServe() }
下面是配置文件code
{ "MainPort": "80", "Rules": [ { "Domain":"bt.onlinecode.cn", "Address":"123.207.241.119:88" }, { "Domain":"test.onlinecode.cn", "Address":"123.207.241.119" } ] }
MainPort:監聽的主端口blog
Rules:就是定義的相關規則,Domain是綁定的IP或域名,Address就是真實的地址路由
下面是運行輸出開發
下面是項目地址:
https://github.com/leeli73/WebRouter
包括Windows x64和Linux x64的幾個release