Защо Go заобикаля проксито за localhost
Разграничете вграденото loopback изключение на Go от 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.