PHP-Editor Zimo stößt bei der Nutzung des Internets manchmal auf die Meldung „502 Bad Gateway“. Diese Fehlermeldung bedeutet, dass zwischen dem Gateway-Server und dem Upstream-Server ein Kommunikationsproblem vorliegt, das dazu führt, dass die Anfrage nicht abgeschlossen wird. Eine der möglichen Ursachen ist ein Net/http-GET-Fehler für den IPSec-Tunnel. Auch wenn dieser Fehler verwirrend sein kann, können wir das Problem schnell lösen und weiterhin den Komfort des Internets genießen, wenn wir seine Ursache verstehen und wissen, wie man ihn behebt.
Weitergabe an Windows ipsec 隧道(vpn)
使用 net/http
包发出远程 get
请求时,get
请求失败,响应代码为 502 bad gateway
。但是,由 curl
发送的具有相同 headers
、uri
、method
的请求效果很好。 go
Der Quellcode lautet wie folgt:
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 }
Nach der Analyse der Paketerfassung des Datenverkehrs stellten wir fest, dass die von vpn接口
可以正常抓到curl
发送的请求,但是get
从go(net/http)
gesendete Anfrage verloren ging.
Dann liegt es vermutlich daran, dass das Framework die falsche Schnittstelle zum Senden des Pakets wählt.
Also versuche ich, die richtige lokale Netzwerkschnittstelle zu finden und deren localaddr
来发送我的 get
Anforderung wie folgt anzugeben:
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 }
Anfragen mit client
函数替换 client
后,get
funktionieren endlich.
client := &http.client{}
=> client, err := client(uri)
Meine Frage ist also, warum golang
nicht die richtige lokale Netzwerkschnittstelle auswählt, um die Anfrage automatisch zu senden? golang
没有选择正确的本地网络接口来自动发送请求?
调试net.dial#DialContext
后,发现该地址已更改为我在Visual Studio Code
net.dial
Nach dem Debuggen von net.dial#DialContext
habe ich festgestellt, dass die Adresse in meinen Visual Studio Code
-Einstellungen in die Proxy-Adresse geändert wurde. Mein Proxyserver kann meine Anwendungsanfragen nicht verarbeiten.
TypeScript/Java/Golang...
,这是我第一次在 vscode
IDE 中的 开发应用程序
上遇到代理问题。换句话说,我从来没有想过 IDE
代理能够完成它构建的工作。由于扩展或者IDE本身使用这个代理设置是合理的,但是我的golang
Wichtige Dinge
Das obige ist der detaillierte Inhalt von502 Bad Gateway: net/http GET für IPSec-Tunnel fehlgeschlagen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!