ทำไม Go จึงข้ามพร็อกซีสำหรับ localhost
แยกข้อยกเว้น loopback ในตัวของ Go ออกจาก NO_PROXY และเปรียบเทียบการเลือกเส้นทางจากสภาพแวดล้อมกับ ProxyURL ที่ระบุชัดเจน
ตัวเลือกพร็อกซีจากสภาพแวดล้อมของ Go มีข้อยกเว้นในตัวสำหรับ localhost และปลายทาง IP แบบ loopback การล้างค่า 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 พร็อกซีที่ให้ไว้สำหรับทุกคำขอที่ส่งเข้ามายังตัวเลือกนั้น
ดังนั้น ทรานสปอร์ตเฉพาะที่ใช้ ProxyURL แบบระบุชัดเจน จึงส่งคำขอไปยังปลายทางภายในเครื่องผ่านพร็อกซีได้ วิธีนี้มีประโยชน์ก็ต่อเมื่อพร็อกซีเข้าถึงปลายทางที่ร้องขอได้อย่างถูกต้องเท่านั้น localhost ของพร็อกซีระยะไกลไม่ใช่ localhost ของแล็ปท็อปคุณ การบังคับเส้นทางจึงไม่ได้เป็นการทดสอบการเชื่อมต่อที่มีประโยชน์โดยอัตโนมัติ
ตรวจสอบก่อนที่โปรเซสจะแคชสภาพแวดล้อม
การตั้งค่าพร็อกซีจากสภาพแวดล้อมของ net/http มาตรฐานจะถูกแคชหลังใช้ครั้งแรก การเปลี่ยนตัวแปรสภาพแวดล้อมภายหลังภายในโปรแกรมเดิมที่กำลังทำงานไม่ใช่วิธีที่เชื่อถือได้ในการทดสอบการตั้งค่าใหม่ซ้ำ ให้เริ่มโปรเซสใหม่พร้อมค่าที่ต้องการ หรือระบุตัวเลือกอย่างชัดเจนซึ่งคุณควบคุมพฤติกรรมได้
พฤติกรรม loopback นี้ใช้กับตัวเลือกพร็อกซีมาตรฐานของ Go 1.27.3 ภาษาและไคลเอนต์ HTTP อื่นอาจใช้กฎการเลือกเส้นทางสำหรับ localhost ต่างออกไป