我无需设置代理即可执行http或https客户端请求,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 ok,但是如果我设置proxy,则脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
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

....................

我总是收到" Bad request ",我阅读了以下文档:https://golang.org/pkg/net/http/:

.........
从Go 1.6开始,使用HTTPS时,http软件包对HTTP / 2协议具有透明支持。必须禁用HTTP / 2的程序可以通过将Transport.TLSNextProto(对于客户端)或Server.TLSNextProto(对于服务器)设置为非空的空映射来执行此操作。或者,当前支持以下GODEBUG环境变量:
..............

因此,我试图停止http2:

1
2
3
4
5
6
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 "),结果是一样的。
这已登录到服务器:

1
{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客户端请求?如何获得正确的结果?

  • 我在代理服务器上测试了您的代码,效果很好。您的代理可能是配置问题。您是否尝试过使用具有此代理的普通Web浏览器?
  • 嗨,IanB您的代理服务器是什么?我使用nginx(反向代理)。您是否使用[TLSNextProto]停止http2?
  • 我使用鱿鱼代理。不,我没有指定TLSNextProto。反向代理不应要求客户端使用任何特殊的代理配置,即应透明
  • 标题的重复项:如何编写程序以使用代理?,但问题不相同。
  • 我非常确定问题出在代理URL。具体来说,必须使用HTTP协议访问代理,然后指定HTTPS。

您的Client.Transport.Proxy配置似乎没有任何问题。两种尝试的方法(ProxyURLProxyFromEnvironment)都可以正常工作,以指定转发代理。

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

需要注意的是,随后的客户端调用不会以某种方式绕过WriteProxy的使用,而是直接调用Write,因为这样做会破坏代理规范。

鉴于此处提供的信息,"错误请求"可能表示您正在访问代理,但不能作为Client.Transport.Proxy所指定的常规HTTP / HTTPS转发代理正常工作。

也许可以在此处添加一些清晰度:如何将Nginx用作HTTP / HTTPS代理服务器?总而言之,NGINX通常不用作转发代理,因此也许这不是您要尝试的操作。

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

旁注:如果未另行指定,&http.Client{}将使用自动包含ProxyFromEnvironmentDefaultTransport,因此仅在构造非默认传输时才需要额外的代理配置(如问题中所做的以指定InsecureSkipVerify),或者您想要具有特定于应用程序的代理配置。同样,仅当使用正向代理时,才需要客户端代理配置。

  • 转发HTTP代理:代理到底如何工作?