我可以在不设置代理的情况下执行 http 或 https 客户端请求,
enter code here
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{}
client.Transport = tr
request, err := http.NewRequest("HEAD", "http://www.???.com", nil)
request.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36")
resp, err := client.Do(request)
if err != nil {
log.Fatalln(err)
return
}
defer resp.Body.Close()
httpcode = resp.Status
Run Code Online (Sandbox Code Playgroud)
这个脚本工作正常,当我请求 https url 时我得到 200 ok,但是如果我设置了 proxy ,脚本:
proxyString := "https://47.91.179.xxx:443"
proxyUrl, _ := url.Parse(proxyString)
tr := &http.Transport{
Proxy: http.ProxyURL(proxyUrl),
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{}
client.Transport = tr
....................
Run Code Online (Sandbox Code Playgroud)
我总是收到“错误的请求”,我阅读了文档:https : //golang.org/pkg/net/http/:
..... 从 Go 1.6 开始,http 包在使用 HTTPS 时透明支持 HTTP/2 协议。必须禁用 HTTP/2 的程序可以通过将 Transport.TLSNextProto(对于客户端)或 Server.TLSNextProto(对于服务器)设置为非 nil 的空映射来实现。或者,当前支持以下 GODEBUG 环境变量:......
所以,我试图停止 http2:
tr := &http.Transport{
Proxy: http.ProxyURL(proxyUrl),
//Proxy: http.ProxyFromEnvironment,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper),
}
Run Code Online (Sandbox Code Playgroud)
同样的问题,“错误的请求”。我试过 os.Setenv("HTTPS_PROXY", "47.91.???.???:443"),结果是一样的。这是登录服务器:
{S;}220.255.95.68{S;}-{S;}07/Mar/2017:17:01:47 +0800{S;}CONNECT www.panpacific.com:443 HTTP/1.1{S;}400{S;}173{S;}340{S;}-{S;}-{S;}-{S;}-{S;}-{S;}www.panpacific.com
Run Code Online (Sandbox Code Playgroud)
那么,golang 是否支持通过代理的 https 客户端请求?我如何获得正确的结果?
您的配置似乎没有任何问题Client.Transport.Proxy。两种尝试的方法(ProxyURL和ProxyFromEnvironment)都应该可以很好地指定转发代理。
相关问题:Go如何编程使用代理?
需要注意的是,尽管不太可能,后续的客户端调用不会以某种方式绕过WriteProxy的使用,而是直接调用Write —— 因为这会破坏代理规范。
鉴于此处提供的信息,“错误请求”可能表示您正在访问代理,但它无法作为通用 HTTP/HTTPS 转发代理正常工作,这正是所Client.Transport.Proxy指定的。
也许这里需要添加一些说明:How to use Nginx as a HTTP/HTTPS proxy server? 。总之,NGINX 通常不用作转发代理,所以也许这不是您想要做的。
如果您尝试使用 NGINX 作为反向代理,那么配置是服务器端的问题,您的客户端不需要特殊的代理配置——只需更改您的请求 URL 以指向代理即可。
旁注:如果没有另外指定,&http.Client{}将使用DefaultTransport自动包含ProxyFromEnvironment,因此仅当您正在构造非默认传输(如问题中为了指定 所做的那样InsecureSkipVerify)或者您想要一个应用程序时,才需要额外的代理配置- 特定的代理配置。 并且,重复一遍,仅在使用转发代理时才需要客户端代理配置。
| 归档时间: |
|
| 查看次数: |
17447 次 |
| 最近记录: |