golang反向代理 实现类似nginx的静态服务器

2018/08/29
因为前段用vue的缘故,所以进行了golang的代理,发现网上的百度,谷歌很多都是错误的
没有靠谱的答案,所以查了很多资源最好找到了问题的答案
直接上代码 
注(webhtml就是静态页面存放目录,vue打包后扔进去;proxyUrl代理的服务器url 所有请求要api目录路径)


上代码


package main

import (
	"flag"
	"fmt"
	"net/http"
	"net/http/httputil"
	"net/url"
	"os"
	"strconv"
)

var (
	p string
	d int
)

const proxyUrl string = "http://www.kongzi.me"

func init() {

	flag.StringVar(&p, "dirname", "E:/webhtml", "please set dirname")
	flag.IntVar(&d, "port", 8080, "please set port")
}

func main() {
	flag.Parse()

	if d > 65535 || d < 1000 { //检测端口是否正常
		fmt.Println("====端口号输入错误====")
		os.Exit(500)
	}

	if b, _ := Ispath(p); !b { //检测目录是否存在
		fmt.Println("====目录不存在====")
		os.Exit(500)
	}

	fmt.Println("==========目录地址和端口号 通过-h参数添加==========\n默认目录地址:"+p+"\n默认端口号为:", d)
	http.Handle("/", http.FileServer(http.Dir(p))) //静态服务器

	http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) { //进行反向代理操作

		remote, err := url.Parse(proxyUrl)
		if err != nil {
			panic(err)
		}
		proxy := httputil.NewSingleHostReverseProxy(remote)

		proxy.Director = func(req *http.Request) {
			req.URL.Scheme = remote.Scheme
			req.URL.Host = remote.Host
			req.Host = remote.Host
		}

		proxy.ServeHTTP(w, r)
		fmt.Printf("%#v\n", proxy)
	})

	strd := ":" + strconv.Itoa(d)
	http.ListenAndServe(strd, nil)

}

func Ispath(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}




个人随笔

安静的等待,你若盛开,蝴蝶自来

承接高质量 网站开发 app开发 如有需要请点击About联系

@承鹏辉