Kodėl Go apeina įgaliotąjį serverį jungdamasis prie localhost
Atskirkite į Go įtaisytą loopback išimtį nuo NO_PROXY ir palyginkite aplinka grindžiamą maršrutizavimą su aiškiu ProxyURL.
Go aplinka grindžiamas įgaliotojo serverio parinkiklis turi įtaisytą išimtį localhost ir loopback IP paskirties adresams. NO_PROXY išvalymas šios išimties nepašalina. Todėl vietinis bandymas gali jungtis tiesiogiai, nors užklausa viešam serverio vardui naudoja įgaliotąjį serverį, kaip tikėtasi.
Taisyklė susijusi su užklausos paskirtimi. Ji nedraudžia naudoti įgaliotojo serverio klausymo taško, kurio paties adresas yra 127.0.0.1.
Patikrinkite parinkiklį nesiųsdami užklausos
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)
}
}
Jei norite pamatyti palyginimą su aplinka, paleiskite programą procesui nustatę įgaliotojo serverio kintamuosius. Programa tik įvertina parinkiklius; ji nesijungia nei prie dokumentacijos pavyzdžio įgaliotojo serverio, nei prie kurios nors paskirties vietos.
Aptikimas iš aplinkos ir aiškus parinkiklis yra skirtingos politikos
ProxyFromEnvironment atsižvelgia į paskirties schemą, aplinkos nuostatas ir apėjimo taisykles, įskaitant specialų loopback apdorojimą. ProxyURL grąžina pateiktą įgaliotojo serverio URL kiekvienai tam parinkikliui perduotai užklausai.
Todėl atskiras transport su aiškiu ProxyURL gali siųsti užklausą vietinei paskirties vietai per įgaliotąjį serverį. Tai naudinga tik jei įgaliotasis serveris gali teisėtai pasiekti prašomą vietą. Nuotolinio įgaliotojo serverio localhost nėra jūsų nešiojamojo kompiuterio localhost, tad priverstinis maršrutas savaime nėra naudingas ryšio bandymas.
Patikrinkite, kol procesas dar neįrašė aplinkos į podėlį
Standartinio net/http aplinkos įgaliotojo serverio konfigūracija po pirmo naudojimo įrašoma į podėlį. Vėliau toje pačioje veikiančioje programoje pakeisti aplinkos kintamąjį nėra patikimas būdas pakartoti bandymą su nauja konfigūracija. Paleiskite naują procesą su norimomis reikšmėmis arba pateikite aiškų parinkiklį, kurio veikimą valdote.
Šis loopback veikimas taikomas standartiniam Go 1.27.3 įgaliotojo serverio parinkikliui. Kitos kalbos ir HTTP klientai gali naudoti kitokias localhost maršrutizavimo taisykles.