Miksi Go ohittaa välityspalvelimen localhost-kohteissa
Erota Gon sisäinen loopback-poikkeus NO_PROXY-asetuksesta ja vertaa ympäristöön perustuvaa reititystä eksplisiittiseen ProxyURL-valintaan.
Gon ympäristöön perustuvassa välityspalvelimen valitsimessa on sisäinen poikkeus localhost- ja loopback-IP-kohteille. NO_PROXY-muuttujan tyhjentäminen ei poista tätä poikkeusta. Siksi paikallinen testi voi muodostaa suoran yhteyden samalla, kun julkiseen isäntänimeen tehty pyyntö käyttää välityspalvelinta odotetusti.
Sääntö koskee pyynnön kohdetta. Se ei estä käyttämästä välityspalvelimen kuuntelupistettä, jonka oma osoite on 127.0.0.1.
Tutki valitsinta lähettämättä pyyntöä
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)
}
}
Jos haluat nähdä ympäristövertailun, suorita ohjelma siten, että prosessin välityspalvelinmuuttujat on asetettu. Ohjelma vain arvioi valitsimet; se ei muodosta yhteyttä dokumentaatioesimerkin välityspalvelimeen eikä mihinkään kohteista.
Ympäristöstä etsiminen ja eksplisiittinen valitsin ovat eri käytäntöjä
ProxyFromEnvironment ottaa huomioon kohteen skeeman, ympäristöasetukset ja ohitussäännöt, mukaan lukien loopback-osoitteiden erityiskäsittelyn. ProxyURL palauttaa annetun välityspalvelin-URL:n jokaiselle kyseiselle valitsimelle välitetylle pyynnölle.
Siksi erillinen transport, jolla on eksplisiittinen ProxyURL, voi lähettää pyynnön paikalliseen kohteeseen välityspalvelimen kautta. Tästä on hyötyä vain, jos välityspalvelin voi oikeutetusti tavoittaa pyydetyn kohteen. Etävälityspalvelimen localhost ei ole kannettavasi localhost, joten reitin pakottaminen ei automaattisesti ole hyödyllinen yhteystesti.
Tarkista ennen kuin prosessi on tallentanut ympäristön välimuistiin
Tavallisen net/http:n ympäristöön perustuva välityspalvelinasetus tallennetaan välimuistiin ensimmäisen käytön jälkeen. Ympäristömuuttujan muuttaminen myöhemmin samassa käynnissä olevassa ohjelmassa ei ole luotettava tapa toistaa testiä uudella asetuksella. Käynnistä uusi prosessi halutuilla arvoilla tai anna eksplisiittinen valitsin, jonka toimintaa hallitset.
Tämä loopback-käyttäytyminen koskee Go 1.27.3:n vakiomuotoista välityspalvelimen valitsinta. Muut kielet ja HTTP-asiakkaat voivat käyttää erilaisia localhost-reitityssääntöjä.