【问题标题】:What's required to build a complete HTTP reverse proxy in go?在 Go 中构建完整的 HTTP 反向代理需要什么?
【发布时间】:2017-08-31 12:39:04
【问题描述】:

一个天真的反向代理是这样的:

package main

import (
    "net/http"
    "net/http/httputil"
    "net/url"
    "fmt"
)

func main() { 
    // New functionality written in Go
    http.HandleFunc("/new", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "New function")
    })

    // Anything we don't do in Go, we pass to the old platform
    u, _ := url.Parse("http://www.google.com/")
    http.Handle("/", httputil.NewSingleHostReverseProxy(u))

    // Start the server
    http.ListenAndServe(":8080", nil)
}

但是,这是不完整的。根据网站的不同,您可能不会得到任何有用的东西。有些人做https重定向。有些人抱怨直接 ip 访问。我怀疑虚拟主机不起作用?没有把握。

真正的反向代理是如何完成的?

【问题讨论】:

  • 棘手的是,您希望 RP 具有镜像 Google 的行为(例如在您的示例中设置 Host 标头并遵循重定向)可能不是您想要的 RP 坐在前面您的应用服务器(为了缓存、提供静态内容、过滤 DoS 攻击等)。在我们知道您的应用出了什么问题之前,您可能很难凭直觉知道您需要什么。
  • 检查这个项目可能会给你一些想法slashquery.com

标签: go reverse-proxy


【解决方案1】:

在 Go 中实现反向 HTTP 代理的最简单方法是使用标准库中的 httputil.ReverseProxy 类型。

这使您可以灵活地设置可以修改传入请求的Director 函数,以及可以即时修改请求和/或响应的Transport

它应该能够处理绝大多数反向代理情况。我在我的一个项目中使用它取得了巨大的成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2015-01-22
    相关资源
    最近更新 更多