В механизме выбора прокси по окружению в Go есть встроенное исключение для localhost и целевых loopback IP-адресов. Очистка NO_PROXY не удаляет это исключение. Поэтому локальный тест может идти напрямую, хотя запрос к публичному имени хоста использует прокси, как и ожидалось.

Правило касается адресата запроса. Оно не мешает использовать слушатель прокси, собственный адрес которого — 127.0.0.1.

Проверьте выбор без отправки запроса

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

Если хотите увидеть сравнение с окружением, запустите программу с заданными для процесса прокси-переменными. Программа только вычисляет результаты функций выбора; она не подключается ни к прокси из документации, ни к одному из адресатов.

Выбор из окружения и явная функция выбора — разные политики

ProxyFromEnvironment учитывает схему адресата, настройки окружения и правила обхода, включая особую обработку loopback. ProxyURL возвращает заданный URL прокси для каждого запроса, переданного этой функции выбора.

Поэтому отдельный transport с явным ProxyURL может направить запрос к локальному адресату через прокси. Это полезно, только если прокси может правомерно достичь запрошенного адресата. localhost удалённого прокси — не localhost вашего ноутбука, поэтому принудительная маршрутизация сама по себе не делает проверку связности полезной.

Проверяйте до того, как процесс закэшировал окружение

Прокси-конфигурация из окружения в стандартном net/http кэшируется после первого использования. Изменение переменной окружения позднее внутри той же работающей программы — ненадёжный способ повторить проверку с новой конфигурацией. Запустите новый процесс с нужными значениями или задайте явную функцию выбора, поведением которой управляете сами.

Это поведение loopback относится к стандартному механизму выбора прокси Go 1.27.3. Другие языки и HTTP-клиенты могут использовать иные правила маршрутизации для localhost.

Похожие статьи