proxy.txt

domain=https://www.baidu.com
port=8080

main.go

package main

import (
	"fmt"
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
	"os"
	"strings"
)

func main() {
	// 读取 proxy.txt 文件内容
	data, err := os.ReadFile("proxy.txt")
	if err != nil {
		log.Fatal(err)
	}

	// 解析 proxy.txt 文件内容
	lines := strings.Split(string(data), "\n")
	config := make(map[string]string)
	for _, line := range lines {
		parts := strings.Split(line, "=")
		if len(parts) == 2 {
			config[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
		}
	}

	// 从配置中获取域名和端口号
	domain := config["domain"]
	port := config["port"]

	// 解析协议和主机
	targetURL, err := url.Parse(domain)
	if err != nil {
		log.Fatal("Failed to parse target URL:", err)
	}

	// 创建一个反向代理
	proxy := httputil.NewSingleHostReverseProxy(targetURL)

	// 修改请求头中的Host字段,确保请求发送到正确的目标主机
	proxy.Director = func(req *http.Request) {
		req.URL.Scheme = targetURL.Scheme
		req.URL.Host = targetURL.Host
		req.Host = targetURL.Host
		// 添加自定义的Origin字段
		req.Header.Set("Origin", targetURL.Scheme+"://"+targetURL.Host)
	}

	// 处理跨域请求
	proxy.ModifyResponse = func(resp *http.Response) error {
		// 添加允许跨域的头部信息
		resp.Header.Set("Access-Control-Allow-Origin", "*")
		resp.Header.Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
		// 添加 x-custom-header
		resp.Header.Set("Access-Control-Allow-Headers", "Content-Type, x-custom-header")
		return nil
	}

	// 创建一个HTTP服务器来接收客户端请求
	server := &http.Server{
		Addr:    ":" + port, // 服务器监听的端口,从配置中获取
		Handler: proxy,      // 使用反向代理处理请求
	}

	fmt.Printf("Starting server on port %s...\n", port)
	log.Fatal(server.ListenAndServe())
}