Gos umgebungsbasierte Proxyauswahl hat eine eingebaute Ausnahme für localhost und Loopback-IP-Ziele. Das Leeren von NO_PROXY entfernt diese Ausnahme nicht. Deshalb kann ein lokaler Test direkt verbinden, während eine Anfrage an einen öffentlichen Hostnamen den Proxy wie erwartet verwendet.

Die Regel betrifft das Ziel der Anfrage. Sie hindert dich nicht daran, einen Proxy-Listener zu verwenden, dessen eigene Adresse 127.0.0.1 ist.

Die Auswahl prüfen, ohne eine Anfrage zu senden

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

Wenn du den Vergleich mit der Umgebung sehen möchtest, starte das Programm mit gesetzten Proxyvariablen für den Prozess. Es wertet nur die Auswahlfunktionen aus; es verbindet sich weder mit dem Dokumentationsproxy noch mit einem der Ziele.

Umgebungserkennung und explizite Auswahl verfolgen unterschiedliche Regeln

ProxyFromEnvironment berücksichtigt das Zielschema, Umgebungseinstellungen und Umgehungsregeln einschließlich der besonderen Loopback-Behandlung. ProxyURL gibt für jede Anfrage, die an diese Auswahlfunktion übergeben wird, die angegebene Proxy-URL zurück.

Ein eigener Transport mit explizitem ProxyURL kann daher auch ein lokales Ziel über einen Proxy ansprechen. Das ist nur sinnvoll, wenn der Proxy das angefragte Ziel berechtigterweise erreichen kann. localhost auf einem entfernten Proxy ist nicht localhost auf deinem Laptop; das Erzwingen dieser Route ist daher nicht automatisch ein sinnvoller Verbindungstest.

Prüfen, bevor der Prozess seine Umgebung zwischengespeichert hat

Die umgebungsbasierte Proxykonfiguration des standardmäßigen net/http wird nach der ersten Verwendung zwischengespeichert. Später im selben laufenden Programm eine Umgebungsvariable zu ändern, ist kein zuverlässiger Weg, einen frischen Konfigurationstest zu wiederholen. Starte einen neuen Prozess mit den gewünschten Werten oder übergib eine explizite Auswahlfunktion, deren Verhalten du steuerst.

Dieses Loopback-Verhalten gilt für die Standard-Proxyauswahl von Go 1.27.3. Andere Sprachen und HTTP-Clients können andere Routingregeln für localhost verwenden.

Ähnliche Artikel