【Go语言】HTTP代理转发给另一个网站 并除去跨域检测

本文介绍如何使用Go语言编写一个HTTP代理,将请求转发到其他网站并解决跨域问题。通过设置代理模式,可以有效地进行请求的中转,并处理跨域限制,为前端开发提供便利。

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())
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值