لماذا يتجاوز Go الوكيل عند الاتصال بـ localhost
ميّز بين استثناء الاسترجاع المدمج في 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 مخطط الوجهة وإعدادات البيئة وقواعد التجاوز، بما فيها المعالجة الخاصة للاسترجاع. أما ProxyURL فيعيد عنوان URL للوكيل الذي زوّدته به لكل طلب يُمرَّر إلى ذلك المحدد.
لذلك يستطيع ناقل مخصص يستخدم ProxyURL صريحًا إرسال طلب إلى وجهة محلية عبر وكيل. ولا يفيد ذلك إلا إذا كان الوكيل قادرًا على الوصول بصورة مشروعة إلى الوجهة المطلوبة. فـ localhost لدى وكيل بعيد ليس localhost في حاسوبك المحمول، لذا لا يُعد فرض المسار تلقائيًا اختبار اتصال مفيدًا.
تحقق قبل أن تخزّن العملية بيئتها مؤقتًا
تُخزَّن إعدادات الوكيل المعتمدة على البيئة في net/http القياسي مؤقتًا بعد أول استخدام. تغيير متغير بيئة لاحقًا داخل البرنامج نفسه أثناء تشغيله ليس طريقة موثوقة لإعادة اختبار إعداد جديد. ابدأ عملية جديدة بالقيم المقصودة، أو قدّم محددًا صريحًا تتحكم في سلوكه.
ينطبق سلوك الاسترجاع هذا على محدد الوكيل القياسي في Go 1.27.3. وقد تستخدم لغات وعملاء HTTP آخرون قواعد مختلفة لتوجيه localhost.