You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang反向代理接口转发:指定接口分端口实现求代码

Golang 反向代理路径匹配转发实现方案

实现思路

利用Go标准库net/http和net/http/httputil构建反向代理,通过路径匹配逻辑将不同请求转发到对应端口:

  • 匹配/api/v1/test、/api/v1/test/jiekou → 转发到localhost:6666
  • 匹配/api/v1/test666/jiekou、/api/v1/test666/jiekou1 → 转发到localhost:8888

提供两种匹配方案:模糊前缀匹配(适合通路子路径)、精确正则匹配(适合指定固定路径),按需选择。

完整代码实现

方案1:模糊前缀匹配(匹配所有/api/v1/test开头的路径)

package main

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

func main() {
	// 初始化6666端口的代理目标
	target666, err := url.Parse("http://localhost:6666")
	if err != nil {
		log.Fatalf("Failed to parse target URL for 6666: %v", err)
	}
	proxy666 := httputil.NewSingleHostReverseProxy(target666)

	// 初始化8888端口的代理目标
	target888, err := url.Parse("http://localhost:8888")
	if err != nil {
		log.Fatalf("Failed to parse target URL for 8888: %v", err)
	}
	proxy888 := httputil.NewSingleHostReverseProxy(target888)

	// 自定义路由处理函数
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		path := r.URL.Path

		switch {
		case strings.HasPrefix(path, "/api/v1/test"):
			// 可选:如果后端不需要前缀,可以移除路径前缀
			// r.URL.Path = strings.TrimPrefix(path, "/api/v1/test")
			proxy666.ServeHTTP(w, r)
		case strings.HasPrefix(path, "/api/v1/test666"):
			// 可选:移除路径前缀
			// r.URL.Path = strings.TrimPrefix(path, "/api/v1/test666")
			proxy888.ServeHTTP(w, r)
		default:
			http.Error(w, "404 Not Found", http.StatusNotFound)
		}
	})

	log.Println("Reverse proxy running on :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

方案2:精确正则匹配(仅匹配指定的几个路径)

如果需要严格匹配用户指定的路径,避免误转发其他子路径,使用正则表达式:

package main

import (
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
	"regexp"
)

// 预编译正则表达式,提升性能
var (
	path666 = regexp.MustCompile(`^/api/v1/test(/jiekou)?$`)
	path888 = regexp.MustCompile(`^/api/v1/test666/(jiekou|jiekou1)$`)
)

func main() {
	target666, err := url.Parse("http://localhost:6666")
	if err != nil {
		log.Fatalf("Failed to parse target URL for 6666: %v", err)
	}
	proxy666 := httputil.NewSingleHostReverseProxy(target666)

	target888, err := url.Parse("http://localhost:8888")
	if err != nil {
		log.Fatalf("Failed to parse target URL for 8888: %v", err)
	}
	proxy888 := httputil.NewSingleHostReverseProxy(target888)

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		path := r.URL.Path

		switch {
		case path666.MatchString(path):
			proxy666.ServeHTTP(w, r)
		case path888.MatchString(path):
			proxy888.ServeHTTP(w, r)
		default:
			http.Error(w, "404 Not Found", http.StatusNotFound)
		}
	})

	log.Println("Reverse proxy running on :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

关键说明

  1. 路径修改:如果后端服务不需要请求前缀(比如希望转发到localhost:6666/jiekou而不是localhost:6666/api/v1/test/jiekou),取消代码中路径修剪的注释即可。
  2. 错误处理:代码中添加了URL解析的错误检查,避免启动失败。
  3. 端口监听:示例中代理服务监听8080端口,可根据需求修改。

内容的提问来源于stack exchange,提问作者Dreamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:04:57