Механізм вибору проксі з оточення у 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.

Схожі статті