Golang 反向代理返回 Not found 或 Forbidden 错误

标签 go proxy reverse-proxy go-gin

我正在尝试创建一个反向代理,它接受所有请求并将它们重定向到目标 url,如 google.com 或任何其他 API。不幸的是,所有目标都返回错误,例如找不到页面或禁止错误

func main() {
	r := gin.Default()

	eanAPI := api.NewEanAPI()

	routers.InitRedirectRoutes(r, eanAPI)
	port := os.Getenv("PORT")
	if len(port) == 0 {
		port = "8000"
	}
	r.Run(":" + port)
}

// InitRedirectRoutes initialize routes redirection.
func InitRedirectRoutes(r *gin.Engine, eanAPI api.EanAPI) {
	r.POST("/*action", eanAPI.ReverseProxy)
	r.GET("/*action", eanAPI.ReverseProxy)
}


type EanAPI interface {
	ReverseProxy(ctx *gin.Context)
}

type eanAPI struct {
	baseURL string
}

func NewEanAPI() EanAPI {
	return &eanAPI{}
}

func (api *eanAPI) ReverseProxy(ctx *gin.Context) {
    // proxy
    forwardToHost := "http://httpbin.org/"
    // I tried with "https://jsonplaceholder.typicode.com/" 
    "http://google.com"

	reverseProxy := proxy.NewProxy(forwardToHost)
	reverseProxy.Handle(ctx.Writer, ctx.Request, url.Parse(forwardToHost))
}

type Prox struct {
	target *url.URL
	proxy  *httputil.ReverseProxy
}

func NewProxy(target string) *Prox {
	url, _ := url.Parse(target)
	fmt.Println("url", url)
	return &Prox{target: url, proxy: httputil.NewSingleHostReverseProxy(url)}
}

func (p *Prox) Handle(w http.ResponseWriter, r *http.Request, origin *url.URL) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.Header().Set("X-Forwarded-Host", r.Host)
	w.Header().Set("X-Origin-Host", origin.Host)
	r.URL.Scheme = origin.Scheme
	r.URL.Host = origin.Host

	p.proxy.ServeHTTP(w, r)
}

我花了很多天试图设置适当的 header ,但到目前为止没有任何效果。我认为 header 设置不正确,但我不知道如何从客户端复制 header 并将其添加到代理。

我使用代理而不是重定向,因为我必须对正文请求和响应做一些工作!

提前致谢!

最佳答案

不确定这是否有帮助,但 https://golang.org/pkg/net/http/httputil/#ReverseProxy您可以使用 Director 函数调试和更改请求的路径,检查传入的请求。还要确保不仅更改 req.URL.Host,还要更改 req.Host,因为它会被 apache/nginx 虚拟主机设置选中。不要放弃,记得玩得开心:)

关于Golang 反向代理返回 Not found 或 Forbidden 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52374659/

相关文章:

api - 如何在 swagger 后端实现新的媒体类型

string - 如何将 []int8 转换为字符串

C++ 使用 Winsock 写入/读取套接字

Apache2 代理反向断开 Tomcat8 链接

通过 Squid 代理进行 NPM 安装失败并出现 UNABLE_TO_VERIFY_LEAF_SIGNATURE

go - 如何修复 Mac 上的 dep ensure 错误 'cannot stat file'?

json - Go struct 表示 twitter JSON 结果

android - 无法解析配置 ':classpath' 的所有依赖项

javascript - 带有代理和域\用户的 node.js http :password authorization

apache - 我可以将一些确切的远程 URL 映射到具有不同端口的本地 URL