چرا Go برای localhost پراکسی را دور میزند
استثنای loopback داخلی Go را از تنظیم NO_PROXY جدا کنید و مسیریابی مبتنی بر محیط را با ProxyURL صریح مقایسه کنید.
انتخابگر پراکسی مبتنی بر محیط در Go برای localhost و مقصدهای 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 داشته باشند.