Zašto Go zaobilazi proxy za localhost
Razlikujte ugrađeni Goov loopback izuzetak od NO_PROXY i uporedite izbor iz okruženja s eksplicitnim ProxyURL.
Goov birač proxyja iz okruženja ima ugrađeni izuzetak za localhost i odredišta s loopback IP adresama. Pražnjenje NO_PROXY ne uklanja taj izuzetak. Zato lokalni test može ići direktno, dok zahtjev prema javnom nazivu hosta koristi proxy kako se očekuje.
Pravilo se odnosi na odredište zahtjeva. Ne sprečava vas da koristite proxy slušača čija je vlastita adresa 127.0.0.1.
Provjerite birač bez slanja zahtjeva
package main
import (
"fmt"
"net/http"
"net/url"
)
func main() {
fixed, _ := url.Parse("http://203.0.113.10:8080")
for _, target := range []string{
"http://localhost:8000/",
"http://127.0.0.1:8000/",
"http://example.com/",
} {
request, _ := http.NewRequest("GET", target, nil)
discovered, err := http.ProxyFromEnvironment(request)
explicit, _ := http.ProxyURL(fixed)(request)
fmt.Println(target, discovered, explicit, err)
}
}
Ako želite vidjeti poređenje s okruženjem, pokrenite program s proxy varijablama postavljenim za proces. Program samo izračunava rezultate birača; ne povezuje se ni s proxyjem iz dokumentacije ni s bilo kojim odredištem.
Otkrivanje iz okruženja i eksplicitni birač koriste različita pravila
ProxyFromEnvironment uzima u obzir shemu odredišta, postavke okruženja i pravila zaobilaženja, uključujući posebnu obradu loopback adresa. ProxyURL vraća zadani URL proxyja za svaki zahtjev proslijeđen tom biraču.
Zato namjenski transport s eksplicitnim ProxyURL može poslati zahtjev lokalnom odredištu preko proxyja. To je korisno samo kada proxy može opravdano dosegnuti traženo odredište. localhost udaljenog proxyja nije localhost vašeg laptopa, pa nametanje rute nije automatski koristan test povezivosti.
Provjerite prije nego što proces pohrani okruženje u keš
Proxy konfiguracija iz okruženja u standardnom net/http pohranjuje se u keš nakon prve upotrebe. Kasnija promjena varijable okruženja unutar istog pokrenutog programa nije pouzdan način da ponovite test sa svježom konfiguracijom. Pokrenite novi proces sa željenim vrijednostima ili zadajte eksplicitni birač čijim ponašanjem upravljate.
Ovo loopback ponašanje važi za standardni birač proxyja u Go 1.27.3. Drugi jezici i HTTP klijenti mogu koristiti drugačija pravila usmjeravanja za localhost.