ตัวเลือกพร็อกซีจากสภาพแวดล้อมของ 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 ต่างออกไป

บทความที่เกี่ยวข้อง