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端口上,并将所有请求转发到目标服务器。