Go’s proxyselectie op basis van de omgeving heeft een ingebouwde uitzondering voor localhost en loopback-IP-bestemmingen. NO_PROXY leegmaken verwijdert die uitzondering niet. Daardoor kan een lokale test rechtstreeks verbinden terwijl een request naar een publieke hostnaam de proxy zoals verwacht gebruikt.

De regel gaat over de bestemming van het request. Hij verhindert niet dat je een proxylistener gebruikt waarvan het eigen adres 127.0.0.1 is.

Inspecteer de selector zonder een request te versturen

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)
    }
}

Wil je de vergelijking met de omgeving zien, voer het programma dan uit met de proxyvariabelen ingesteld voor het proces. Het programma evalueert alleen selectors; het maakt geen verbinding met de documentatieproxy of een van de bestemmingen.

Omgevingsdetectie en een expliciete selector volgen verschillend beleid

ProxyFromEnvironment houdt rekening met het bestemmingsschema, de omgevingsinstellingen en de omzeilingsregels, inclusief de bijzondere loopback-afhandeling. ProxyURL retourneert de opgegeven proxy-URL voor elk request dat aan die selector wordt doorgegeven.

Een apart transport met een expliciete ProxyURL kan dus een request naar een lokale bestemming via een proxy sturen. Dat is alleen nuttig wanneer de proxy de gevraagde bestemming op legitieme wijze kan bereiken. De localhost van een externe proxy is niet de localhost van je laptop, dus de route afdwingen levert niet automatisch een nuttige verbindingstest op.

Controleer voordat het proces zijn omgeving heeft gecachet

De omgevingsproxyconfiguratie van standaard net/http wordt na het eerste gebruik gecachet. Later een omgevingsvariabele wijzigen in hetzelfde draaiende programma is geen betrouwbare manier om opnieuw een test met verse configuratie uit te voeren. Start een nieuw proces met de bedoelde waarden of geef een expliciete selector op waarvan je het gedrag beheerst.

Dit loopback-gedrag geldt voor de standaardproxyselector van Go 1.27.3. Andere talen en HTTP-clients kunnen andere routeringsregels voor localhost gebruiken.

Gerelateerde artikelen