לבוחר הפרוקסי של 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 של הפרוקסי שסופקה עבור כל בקשה שמועברת לבוחר הזה.

לכן רכיב transport ייעודי עם ProxyURL מפורש יכולה לשלוח בקשה ליעד מקומי דרך פרוקסי. הדבר שימושי רק אם הפרוקסי יכול להגיע באופן לגיטימי ליעד המבוקש. ה־localhost של פרוקסי מרוחק אינו ה־localhost של המחשב הנייד שלכם, ולכן כפיית הנתיב אינה יוצרת אוטומטית בדיקת קישוריות מועילה.

בדקו לפני שהתהליך שומר את הסביבה במטמון

הגדרות הפרוקסי מהסביבה ב־net/http התקני נשמרות במטמון לאחר השימוש הראשון. שינוי משתנה סביבה מאוחר יותר באותה תוכנית פועלת אינו דרך אמינה לחזור על בדיקה עם הגדרות חדשות. הפעילו תהליך חדש עם הערכים הרצויים, או ספקו בוחר מפורש שהתנהגותו בשליטתכם.

התנהגות loopback זו חלה על בוחר הפרוקסי התקני של Go 1.27.3. שפות ולקוחות HTTP אחרים עשויים להשתמש בכללי ניתוב אחרים עבור localhost.

מאמרים קשורים