Почему Go обходит прокси для localhost
Отличайте встроенное исключение Go для loopback от NO_PROXY и сравнивайте выбор по окружению с явным ProxyURL.
В механизме выбора прокси по окружению в 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.