Γιατί το 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.