먼저 역방향 프록시 구조를 얻는 방법을 살펴보겠습니다
func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy { targetQuery := target.RawQuery director := func(req *http.Request) { req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) if targetQuery == "" || req.URL.RawQuery == "" { req.URL.RawQuery = targetQuery + req.URL.RawQuery } else { req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery } if _, ok := req.Header["User-Agent"]; !ok { req.Header.Set("User-Agent", "") } } return &ReverseProxy{Director: director} }
NewSingleHostReverseProxy는 클로저를 Director로 사용하여 새로운 ReverseProxy 구조를 생성하며, Director는 기본적으로 우리를 위해 구현하는 프록시 기능입니다. 이 기능에서는 요청 URL의 프로토콜, 호스트 및 경로가 다시 작성됩니다. 그러나 req.Host를 다시 작성하지 않으므로 역방향 프록시는 로컬에서만 프록시할 수 있습니다. 따라서 이 함수를 수정하기만 하면 됩니다. 수정하는 방법에는 두 가지가 있습니다.
(추천 튜토리얼: golang 튜토리얼)
수정 방법:
1. 어쨌든 이 함수는 복잡하지 않고, 역방향 프록시 구조가 필요한 곳에 사용하면 됩니다. 우리의 사용자 정의 기능은 새로운 에이전트를 생성합니다.
func NewProxy(target *url.URL) *httputil.ReverseProxy { targetQuery := target.RawQuery director := func(req *http.Request) { req.Host = target.Host // -- 加入这句 -- req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) if targetQuery == "" || req.URL.RawQuery == "" { req.URL.RawQuery = targetQuery + req.URL.RawQuery } else { req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery } if _, ok := req.Header["User-Agent"]; !ok { // explicitly disable User-Agent so it's not set to default value req.Header.Set("User-Agent", "") } } return &httputil.ReverseProxy{Director: director} }
그런 다음 httputil.NewSingleHostReverseProxy(u)를 NewProxy(u)로 바꿔 다른 도메인 이름으로 프록시하세요.
2. 디렉터 기능을 맞춤설정하세요. 우리는 여전히 NewSingleHostReverseProxy 함수를 사용하여 새 프록시를 생성한 다음 이에 대한 Director 함수를 사용자 정의합니다.
p := httputil.NewSingleHostReverseProxy(u) d := p.Director p.Director = func(r *http.Request) { d(r) r.Host = u.Host }
추천 관련 동영상 튜토리얼: golang 동영상 튜토리얼
위 내용은 golang 역방향 프록시에 액세스할 수 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!