Zašto Go zaobilazi proxy za localhost
Razlikujte ugrađenu loopback iznimku u Gou od NO_PROXY i usporedite odabir iz okruženja s eksplicitnim ProxyURL.
Goov birač proxyja iz okruženja ima ugrađenu iznimku za localhost i odredišta s loopback IP adresama. Pražnjenje NO_PROXY ne uklanja tu iznimku. Zato lokalni test može ići izravno, dok zahtjev prema javnom imenu hosta koristi proxy kako se očekuje.
Pravilo se odnosi na odredište zahtjeva. Ne sprječ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)
}
}
Želite li vidjeti usporedbu s okruženjem, pokrenite program s proxy varijablama postavljenima za proces. Program samo izračunava rezultate birača; ne spaja se ni na proxy iz dokumentacije ni na bilo koje odredište.
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 prema lokalnom odredištu kroz proxy. To je korisno samo kad proxy može opravdano pristupiti traženom odredištu. localhost udaljenog proxyja nije localhost vašeg laptopa, pa nametanje rute nije automatski koristan test povezivosti.
Provjerite prije nego što proces spremi okruženje u predmemoriju
Proxy konfiguracija iz okruženja u standardnom net/http sprema se u predmemoriju nakon prve upotrebe. Naknadna promjena varijable okruženja u istom pokrenutom programu nije pouzdan način ponavljanja testa sa svježom konfiguracijom. Pokrenite novi proces sa željenim vrijednostima ili zadajte eksplicitni birač čijim ponašanjem upravljate.
Ovo loopback ponašanje vrijedi za standardni birač proxyja u Go 1.27.3. Drugi jezici i HTTP klijenti mogu koristiti drukčija pravila usmjeravanja za localhost.