如何使用代理执行HTTPS请求



我可以在不设置代理的情况下执行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

此脚本正常运行,当我请求HTTPS URL时,我会得到200个确定,但是如果我设置代理,则脚本:

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
....................

我总是得到"不好的请求",我阅读文档:https://golang.org/pkg/net/http/:

...........从GO 1.6开始,HTTP软件包在使用HTTPS时对HTTP/2协议具有透明的支持。必须禁用http/2的程序可以通过设置transport.tlsnextproto(用于客户端)或server.tlsnextproto(对于服务器)到非nil,空的地图。另外,目前支持以下戈德布格环境变量:..........................

所以,我试图停止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),
}

同样的问题,"不良请求"。我尝试了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

那么,Golang是否通过代理支持HTTPS客户端请求?我如何获得正确的结果?

您的Client.Transport.Proxy配置似乎没有任何问题。两种尝试的方法(ProxyURLProxyFromEnvironment)都应正常指定前向代理。

相关问题:如何编程使用代理?

要注意的东西,多么不可能,是随后的客户端调用以不绕过写入proxy的使用,而是直接呼叫写入 - 因为这会破坏代理规范。


鉴于此处提供的信息,"不良请求"可能表明您正在达到代理,但是它不能作为通用HTTP/HTTPS forward forward Proxy正确地工作,这是Client.Transport.Proxy所指定的。

也许在这里添加一些清晰度:如何将NGINX用作HTTP/HTTPS代理服务器?总而言之,nginx通常不被用作前向代理,所以也许这不是您要做的。

如果您试图将nginx用作反向代理,则配置是服务器端的问题,并且您的客户不需要特殊的代理配置 - 只需更改您的请求URL即可指向代理。


附带注意:如果未另行指定,&http.Client{}将使用自动包含ProxyFromEnvironmentDefaultTransport,因此仅在您构造非违约运输时才需要额外的代理配置(如该问题所做的那样,以指定InsecureSkipVerify)或者您想具有特定于应用程序的代理人。,要重复,仅在使用前向代理时才需要客户端代理配置。

最新更新