Perché Go evita il proxy per localhost
Distingui l’eccezione di loopback integrata in Go da NO_PROXY e confronta l’instradamento tramite ambiente con un ProxyURL esplicito.
Il selettore di proxy basato sull’ambiente di Go include un’eccezione per localhost e le destinazioni con IP di loopback. Svuotare NO_PROXY non elimina questa eccezione. Un test locale può quindi collegarsi direttamente mentre una richiesta a un nome host pubblico usa il proxy come previsto.
La regola riguarda la destinazione della richiesta. Non impedisce di usare un listener proxy il cui indirizzo sia 127.0.0.1.
Esaminare il selettore senza inviare una richiesta
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)
}
}
Per osservare il confronto con l’ambiente, esegui il programma con le variabili proxy impostate per il processo. Il programma valuta soltanto i selettori; non si collega al proxy di documentazione né ad alcuna destinazione.
La scoperta dall’ambiente e un selettore esplicito seguono criteri diversi
ProxyFromEnvironment considera lo schema di destinazione, le impostazioni d’ambiente e le regole di esclusione, compresa la gestione speciale del loopback. ProxyURL restituisce l’URL proxy fornito per ogni richiesta passata a quel selettore.
Un trasporto dedicato con ProxyURL esplicito può quindi inviare una richiesta verso una destinazione locale attraverso un proxy. È utile solo se il proxy può legittimamente raggiungere la destinazione richiesta. Il localhost di un proxy remoto non è il localhost del tuo portatile, perciò forzare il percorso non costituisce automaticamente un test di connettività utile.
Controllare prima che il processo memorizzi l’ambiente nella cache
La configurazione proxy d’ambiente del net/http standard viene memorizzata nella cache dopo il primo utilizzo. Cambiare successivamente una variabile d’ambiente nello stesso programma in esecuzione non è un modo affidabile per ripetere un test con una configurazione nuova. Avvia un nuovo processo con i valori desiderati oppure fornisci un selettore esplicito di cui controlli il comportamento.
Questo comportamento di loopback si applica al selettore di proxy standard di Go 1.27.3. Altri linguaggi e client HTTP possono usare regole di instradamento diverse per localhost.