El selector de proxy por el entorno de Go tiene una excepción integrada para localhost y los destinos con IP de bucle local. Vaciar NO_PROXY no elimina esa excepción. Por ello, una prueba local puede conectarse directamente mientras una solicitud a un nombre de host público utiliza el proxy como se espera.

La regla se refiere al destino de la solicitud. No impide usar un punto de escucha de proxy cuya propia dirección sea 127.0.0.1.

Inspecciona el selector sin enviar una solicitud

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

Si quieres observar la comparación con el entorno, ejecútalo con las variables de proxy definidas para el proceso. El programa solo evalúa los selectores; no se conecta al proxy de documentación ni a ninguno de los destinos.

La detección del entorno y un selector explícito son políticas diferentes

ProxyFromEnvironment tiene en cuenta el esquema de destino, los ajustes del entorno y las reglas de exclusión, incluido su tratamiento especial del bucle local. ProxyURL devuelve la URL de proxy proporcionada para cada solicitud que se pasa a ese selector.

Por tanto, un transporte dedicado con un ProxyURL explícito puede enviar una solicitud a un destino local a través de un proxy. Solo resulta útil si el proxy puede acceder legítimamente al destino solicitado. El localhost de un proxy remoto no es el localhost de tu portátil, por lo que forzar la ruta no constituye automáticamente una prueba de conectividad útil.

Comprueba antes de que el proceso almacene su entorno en caché

La configuración de proxy por el entorno del net/http estándar se almacena en caché después de su primer uso. Cambiar después una variable de entorno dentro del mismo programa en ejecución no es una forma fiable de repetir una prueba de configuración desde cero. Inicia un proceso nuevo con los valores previstos o proporciona un selector explícito cuyo comportamiento controles.

Este comportamiento de bucle local se aplica al selector de proxy estándar de Go 1.27.3. Otros lenguajes y clientes HTTP pueden utilizar reglas de enrutamiento de localhost diferentes.

Artículos relacionados