Чаму 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.