Proč Go pro localhost obchází proxy
Odlište vestavěnou výjimku Go pro loopback od NO_PROXY a porovnejte směrování podle prostředí s explicitním ProxyURL.
Výběr proxy podle prostředí v Go má vestavěnou výjimku pro localhost a cílové loopback IP adresy. Vyprázdnění NO_PROXY tuto výjimku neodstraní. Lokální test tak může jít přímo, zatímco požadavek na veřejný název hostitele používá proxy podle očekávání.
Pravidlo se týká cíle požadavku. Nebrání použití proxy listeneru, jehož vlastní adresa je 127.0.0.1.
Zkontrolujte výběr bez odeslání požadavku
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)
}
}
Chcete-li sledovat porovnání s prostředím, spusťte program s nastavenými proxy proměnnými pro daný proces. Program pouze vyhodnocuje výběrové funkce; nepřipojuje se k dokumentační proxy ani k žádnému z cílů.
Zjišťování z prostředí a explicitní výběr jsou různé politiky
ProxyFromEnvironment bere v úvahu schéma cíle, nastavení prostředí a pravidla obcházení včetně zvláštního zacházení s loopback adresami. ProxyURL vrací zadanou URL proxy pro každý požadavek předaný této výběrové funkci.
Proto může samostatný transport s explicitním ProxyURL odeslat požadavek na lokální cíl přes proxy. Smysl to má jen tehdy, když proxy může oprávněně dosáhnout požadovaného cíle. localhost vzdálené proxy není localhost vašeho notebooku, takže vynucení trasy automaticky neznamená užitečný test konektivity.
Kontrolujte před uložením prostředí do mezipaměti procesu
Konfigurace proxy z prostředí ve standardním net/http se po prvním použití ukládá do mezipaměti. Pozdější změna proměnné prostředí ve stejném běžícím programu není spolehlivý způsob, jak zopakovat test s čerstvou konfigurací. Spusťte nový proces s požadovanými hodnotami nebo zadejte explicitní výběrovou funkci, jejíž chování řídíte.
Toto chování loopback adres platí pro standardní výběr proxy v Go 1.27.3. Jiné jazyky a HTTP klienti mohou pro localhost používat odlišná pravidla směrování.