Editor PHP Zimo kadangkala menemui gesaan 502 Bad Gateway apabila menggunakan Internet. Mesej ralat ini bermakna terdapat masalah komunikasi antara pelayan get laluan dan pelayan huluan, menyebabkan permintaan tidak dapat diselesaikan. Salah satu punca yang mungkin adalah kegagalan net/http GET untuk terowong IPSec. Walaupun ralat ini boleh mengelirukan, dengan memahami puncanya dan cara membetulkannya, kami boleh menyelesaikan isu tersebut dengan cepat dan terus menikmati kemudahan Internet.
dihantar pada tingkap ipsec 隧道(vpn)
使用 net/http
包发出远程 get
请求时,get
请求失败,响应代码为 502 bad gateway
。但是,由 curl
发送的具有相同 headers
、uri
、method
的请求效果很好。 go
Kod sumber adalah seperti berikut:
var req *http.request req, err = http.newrequest('get', *uri, reader) if nil != err { level.warn(log).log("msg", "unable to create request", "err", err, "uri", uri) return nil, err } if nil != req.body { defer req.body.close() } for h, v := range opts.headers { req.header.add(h, *v) } client := http.client{} if nil != err { return nil, err } res, err := client.do(req) if nil != err { level.warn(log).log("msg", "unable to send request", "err", err, "uri", uri) return nil, err } defer res.body.close() buf, err := io.readall(res.body) if nil != err { level.warn(log).log("msg", "unable to read response", "err", err, "uri", uri, "status", res.status, "status_code", res.statuscode) return nil, err }
Selepas menganalisis tangkapan paket trafik, kami mendapati permintaan yang dihantar oleh vpn接口
可以正常抓到curl
发送的请求,但是get
从go(net/http)
telah hilang.
Maka saya rasa mungkin kerana rangka kerja memilih antara muka yang salah untuk menghantar paket.
Jadi saya cuba mencari antara muka rangkaian tempatan yang betul dan nyatakan localaddr
来发送我的 get
permintaannya seperti ini:
func Client(u string) (*http.Client, error) { uri, err := url.Parse(u) if nil != err { return nil, err } host := uri.Host port := uri.Port() if Empty == port { if uri.Scheme == "http" { host = host + ":80" } else if uri.Scheme == "https" { host = host + ":443" } } conn, err := net.Dial("tcp", host) if nil != err { return nil, err } addr := conn.LocalAddr().(*net.TCPAddr) // **make sure using random port as local port** addr.Port = 0 dialer := &net.Dialer{LocalAddr: addr} dialContext := func(ctx context.Context, network, addr string) (net.Conn, error) { conn, err := dialer.Dial(network, addr) return conn, err } transport := &http.Transport{DialContext: dialContext} client := &http.Client{ Transport: transport, } return client, nil }
Permintaan dengan client
函数替换 client
后,get
akhirnya berjaya.
client := &http.client{}
=> client, err := client(uri)
Jadi soalan saya ialah mengapa golang
tidak memilih antara muka rangkaian tempatan yang betul untuk menghantar permintaan secara automatik? golang
没有选择正确的本地网络接口来自动发送请求?
调试net.dial#DialContext
后,发现该地址已更改为我在Visual Studio Code
net.dial
Selepas menyahpepijat net.dial#DialContext
, saya mendapati bahawa alamat telah ditukar kepada alamat proksi dalam tetapan Visual Studio Code
saya. Pelayan proksi saya tidak akan dapat mengendalikan permintaan aplikasi saya.
TypeScript/Java/Golang...
,这是我第一次在 vscode
IDE 中的 开发应用程序
上遇到代理问题。换句话说,我从来没有想过 IDE
代理能够完成它构建的工作。由于扩展或者IDE本身使用这个代理设置是合理的,但是我的golang
Perkara penting
Atas ialah kandungan terperinci 502 Bad Gateway: net/http GET gagal untuk terowong IPSec. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!