Hvorfor Go omgår proxyen for localhost
Skill Gos innebygde loopback-unntak fra NO_PROXY, og sammenlign miljøbasert ruting med en eksplisitt ProxyURL.
Gos miljøbaserte proxyvelger har et innebygd unntak for localhost og loopback-IP-destinasjoner. Å tømme NO_PROXY fjerner ikke dette unntaket. Dermed kan en lokal test gå direkte, mens en forespørsel til et offentlig vertsnavn bruker proxyen som forventet.
Regelen gjelder forespørselens destinasjon. Den hindrer deg ikke i å bruke en proxylytter som selv har adressen 127.0.0.1.
Undersøk velgeren uten å sende en forespørsel
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)
}
}
Hvis du vil se sammenligningen med miljøet, kjører du programmet med proxyvariablene satt for prosessen. Programmet evaluerer bare velgerne; det kobler verken til dokumentasjonsproxyen eller til noen av destinasjonene.
Miljøoppdagelse og en eksplisitt velger følger ulike regler
ProxyFromEnvironment tar hensyn til destinasjonsskjemaet, miljøinnstillingene og reglene for omgåelse, inkludert særbehandlingen av loopback. ProxyURL returnerer den oppgitte proxy-URL-en for hver forespørsel som sendes til denne velgeren.
En egen transport med eksplisitt ProxyURL kan derfor sende en forespørsel til en lokal destinasjon gjennom en proxy. Det er bare nyttig når proxyen på legitimt vis kan nå den forespurte destinasjonen. localhost på en ekstern proxy er ikke localhost på den bærbare datamaskinen din, så en tvungen rute er ikke automatisk en nyttig tilkoblingstest.
Kontroller før prosessen har mellomlagret miljøet
Den miljøbaserte proxykonfigurasjonen i standard net/http mellomlagres etter første bruk. Senere endring av en miljøvariabel inne i det samme kjørende programmet er ikke en pålitelig måte å gjenta en test med en ny konfigurasjon på. Start en ny prosess med de tiltenkte verdiene, eller oppgi en eksplisitt velger som du styrer oppførselen til.
Denne loopback-oppførselen gjelder standardproxyvelgeren i Go 1.27.3. Andre språk og HTTP-klienter kan bruke andre rutingsregler for localhost.