Mengapa Go melewati proxy untuk localhost
Bedakan pengecualian loopback bawaan Go dari NO_PROXY, lalu bandingkan perutean lewat lingkungan dengan ProxyURL eksplisit.
Pemilih proxy berbasis lingkungan milik Go memiliki pengecualian bawaan untuk localhost dan tujuan IP loopback. Mengosongkan NO_PROXY tidak menghapus pengecualian itu. Akibatnya, pengujian lokal bisa terhubung langsung sementara permintaan ke nama host publik menggunakan proxy sesuai harapan.
Aturan ini menyangkut tujuan permintaan. Aturan tersebut tidak menghalangi penggunaan listener proxy yang alamatnya sendiri adalah 127.0.0.1.
Periksa pemilih tanpa mengirim permintaan
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)
}
}
Jika ingin melihat perbandingan dengan lingkungan, jalankan program dengan variabel proxy yang telah ditetapkan untuk proses tersebut. Program hanya mengevaluasi pemilih; program tidak terhubung ke proxy dokumentasi atau tujuan mana pun.
Penemuan dari lingkungan dan pemilih eksplisit adalah kebijakan yang berbeda
ProxyFromEnvironment mempertimbangkan skema tujuan, pengaturan lingkungan, dan aturan bypass, termasuk penanganan khusus loopback. ProxyURL mengembalikan URL proxy yang diberikan untuk setiap permintaan yang diteruskan ke pemilih tersebut.
Karena itu, transport khusus dengan ProxyURL eksplisit dapat mengirim permintaan ke tujuan lokal melalui proxy. Ini hanya berguna jika proxy dapat menjangkau tujuan yang diminta secara sah. localhost milik proxy jarak jauh bukanlah localhost laptop Anda, sehingga memaksakan rute tidak otomatis menjadi pengujian konektivitas yang berguna.
Periksa sebelum proses menyimpan lingkungan ke cache
Konfigurasi proxy berbasis lingkungan pada net/http standar disimpan ke cache setelah penggunaan pertama. Mengubah variabel lingkungan kemudian di dalam program yang sama dan masih berjalan bukan cara andal untuk mengulangi pengujian konfigurasi baru. Mulai proses baru dengan nilai yang diinginkan, atau berikan pemilih eksplisit yang perilakunya Anda kendalikan.
Perilaku loopback ini berlaku pada pemilih proxy standar Go 1.27.3. Bahasa dan klien HTTP lain dapat menggunakan aturan perutean localhost yang berbeda.