golang 역방향 프록시에 액세스할 수 없습니다.

王林
풀어 주다: 2020-03-12 11:26:09
원래의
2807명이 탐색했습니다.

golang 역방향 프록시에 액세스할 수 없습니다.

먼저 역방향 프록시 구조를 얻는 방법을 살펴보겠습니다

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿