[Go]基于Go语言的Web路由转发,多个网站共享一个端口(新版本,支持WebSocket)
之前编写过一个Web路由转发,可以参考我之前的博客
之前的版本具有很多问题,所前段时间一直很忙,在做我的新东西和实习,所以就一直没更新
今天忙里偷闲,就更新一下Web路由
主要解决的还是多语言Web开发时,整合至一个端口的问题
当然除了这个功能,还有很多有趣的用法,比如网站镜像,绕过备案等玩法
废话不说直接上代码
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() }
下面是配置文件
{ "MainPort": "80", "Rules": [ { "Domain":"bt.onlinecode.cn", "Address":"123.207.241.119:88" }, { "Domain":"test.onlinecode.cn", "Address":"123.207.241.119" } ] }
MainPort:监听的主端口
Rules:就是定义的相关规则,Domain是绑定的IP或域名,Address就是真实的地址
下面是运行输出
下面是项目地址:
https://github.com/leeli73/WebRouter
包括Windows x64和Linux x64的几个release