一个简单的golang反向代理的示例代码

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    // 创建一个新的http.ServeMux来处理请求
    mux := http.NewServeMux()

    // 处理所有请求,将它们转发到目标服务器
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // 目标服务器的地址
        targetServer := "http://example.com"

        // 创建一个新的http.Client来发送请求到目标服务器
        client := &http.Client{}

        // 创建一个指向目标服务器的请求
        req, err := http.NewRequest(r.Method, targetServer+r.URL.String(), r.Body)
        if err != nil {
            http.Error(w, "Failed to create request", http.StatusInternalServerError)
            return
        }

        // 将原始请求的头部信息复制到新的请求中
        req.Header = r.Header

        // 发送请求到目标服务器
        resp, err := client.Do(req)
        if err != nil {
            http.Error(w, "Failed to send request", http.StatusBadGateway)
            return
        }
        defer resp.Body.Close()

        // 将目标服务器的响应头部信息复制到原始响应中
        for key, values := range resp.Header {
            for _, value := range values {
                w.Header().Add(key, value)
            }
        }

        // 将目标服务器的响应状态码复制到原始响应中
        w.WriteHeader(resp.StatusCode)

        // 读取目标服务器的响应体,并将其写入原始响应中
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            http.Error(w, "Failed to read response", http.StatusInternalServerError)
            return
        }
        w.Write(body)
    })

    // 启动反向代理服务器
    fmt.Println("Starting reverse proxy server on port 8080...")
    http.ListenAndServe(":8080", mux)
}

在上面的代码中,首先创建了一个新的http.ServeMux来处理请求。然后定义了一个处理器函数来处理所有请求。在处理器函数中,首先构建了指向目标服务器的请求,并将原始请求的头部信息复制到新请求中。然后,使用http.Client发送请求到目标服务器,并将目标服务器的响应头部信息、状态码和响应体复制到原始响应中。

最后,启动了一个反向代理服务器,它监听在8080端口上,并将所有请求转发到目标服务器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值