Go语言HTTP代理,将HTTP连接转发给另一个网站

文章介绍了如何使用Go语言搭建不依赖Nginx的HTTP服务,处理同一服务器上的两个站点A和B。站点A监听80端口,B监听8080,通过检查域名进行跳转。重点在于解决静态资源如CSS目录的共享问题,提出了在handler内处理或单独处理静态文件的两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于GO语言编写一个UFO探索网站,网站没有使用NGINX之类的反射代理,例如只是纯粹使用golang搭建的http服务,在多个网站放在同一个服务器的情况下,管理起来就只能手工写代码了。

现有站点A和站点B,都是放在同一个IP下的主机里面,假如站点A监听80商品,站点B监听8080端口,则需要做特殊处理。因为这两个站点的域名不一样。

站点A代码:

// checkAndRedirect 检查是否要跳转以及一些非法操作的判断
func checkAndRedirect(w http.ResponseWriter, r *http.Request) {
// 如果是通过站点B的域名访问了站点A 通过下面代码转发即可
    if strings.Replace(host, "www.", "", 1) == "站点B域名" {
        u, _ := url.Parse("http://127.0.0.1:8080")
        httputil.NewSingleHostReverseProxy(u).ServeHTTP(w, r)
    }
}

有个非常坑的地方是,如果站点A使用的静态资源是通过下面这样的方式去指定的话,一定要特殊处理,例如站点A的CSS目录映射通过这种方式写的:

  // 站点A首页
    http.HandleFunc("/", handlerA)
    // 站点A的CSS连接映射
    http.Handle("/style/", http.StripPrefix("/style/", http.FileServer(http.Dir("./html/style"))))
func handlerA(w http.ResponseWriter, r *http.Request) {}

这样写会导致站点B也使用这一个目录下的CSS,也就是说,这里的请求也是需要单独做转发的。可以有多种方式做处理,例如:

一、将上面的代码全部放在 handlerA 函数内处理,通过检测 r.URL.Path 做跳转。
二、单独处理静态文件。

type Static struct{}
func (s *Static) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    path := strings.Trim(strings.ToLower(r.URL.Path), "/")
    arr := strings.Split(path, ".")
    if len(arr) != 2 {
        http.NotFound(w, r)
        return
    }
    if arr[1] == "css" {
        path = "./html/style/" + path
        // 载入文件
        buf, err := os.OpenFile(path)
        if err != nil {
            http.NotFound(w, r)
            return
        }
        w.Header().Set("Accept-Ranges", "bytes")
        w.Header().Set("Content-Type", "text/css; charset=utf-8")
        w.Write(buf)
        return
    }
    if arr[1] == "js" {
        path = "./html/js/" + path
        // 载入文件
        buf, err := os.OpenFile(path)
        if err != nil {
            index.HTTP404(w, r)
            return
        }
        fname := strings.Split(path, ".")
        w.Header().Set("Accept-Ranges", "bytes")
        if fix := fname[len(fname)-1]; fix == "js" {
            w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
        } else if fix == "css" {
            w.Header().Set("Content-Type", "text/css; charset=utf-8")
        }
        w.Write(buf)
    }
}

参考资料 http://www.golang-mix.com/golang/52

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值