[Go]基於Go語言的Web路由轉發,多個網站共享一個端口(新版本,支持WebSocket)

以前編寫過一個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

相關文章
相關標籤/搜索