Miért kerüli meg a Go a proxyt localhost esetén?
Különböztesd meg a Go beépített loopback-kivételét a NO_PROXY beállítástól, és hasonlítsd össze a környezeti útválasztást az explicit ProxyURL használatával.
A Go környezetalapú proxyválasztója beépített kivételt tartalmaz a localhost és a loopback IP-célok számára. A NO_PROXY kiürítése nem távolítja el ezt a kivételt. Emiatt egy helyi teszt közvetlenül kapcsolódhat, miközben egy nyilvános gépnévre irányuló kérés az elvárt módon proxyt használ.
A szabály a kérés céljára vonatkozik. Nem akadályozza olyan proxyfigyelő használatát, amelynek saját címe 127.0.0.1.
Vizsgáld meg a választót kérés küldése nélkül
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)
}
}
Ha látni szeretnéd a környezeti összehasonlítást, a folyamat proxyváltozóinak beállításával futtasd a programot. A program csak a választókat értékeli ki; nem kapcsolódik sem a dokumentációs proxyhoz, sem egyik célhoz sem.
A környezeti felderítés és az explicit választó eltérő szabályokat követ
A ProxyFromEnvironment figyelembe veszi a cél sémáját, a környezeti beállításokat és a megkerülési szabályokat, köztük a loopback különleges kezelését. A ProxyURL az átadott proxy-URL-t adja vissza minden olyan kéréshez, amelyet ennek a választónak adnak át.
Ezért egy explicit ProxyURL-t használó külön transport a helyi célhoz tartozó kérést is proxyn keresztül küldheti. Ez csak akkor hasznos, ha a proxy jogosan elérheti a kért célt. A távoli proxy localhost címe nem a laptopod localhost címe, ezért az útvonal kikényszerítése önmagában nem jelent hasznos kapcsolódási tesztet.
Ellenőrizz, mielőtt a folyamat gyorsítótárazza a környezetét
A szabványos net/http környezetalapú proxykonfigurációja az első használat után gyorsítótárba kerül. Ha később ugyanabban a futó programban megváltoztatsz egy környezeti változót, az nem megbízható mód egy új konfigurációs teszt megismétlésére. Indíts új folyamatot a kívánt értékekkel, vagy adj meg olyan explicit választót, amelynek viselkedését te szabályozod.
Ez a loopback-viselkedés a Go 1.27.3 szabványos proxyválasztójára vonatkozik. Más nyelvek és HTTP-kliensek eltérő localhost-útválasztási szabályokat használhatnak.