Vì sao Go bỏ qua proxy đối với localhost
Phân biệt ngoại lệ loopback tích hợp của Go với NO_PROXY và so sánh định tuyến theo môi trường với ProxyURL được chỉ định rõ.
Bộ chọn proxy theo môi trường của Go có ngoại lệ tích hợp cho localhost và các đích IP loopback. Xóa giá trị NO_PROXY không loại bỏ ngoại lệ đó. Vì vậy, một phép thử cục bộ có thể kết nối trực tiếp trong khi yêu cầu tới tên máy chủ công khai vẫn dùng proxy như dự kiến.
Quy tắc này liên quan đến đích của yêu cầu. Nó không ngăn bạn dùng trình lắng nghe proxy có địa chỉ riêng là 127.0.0.1.
Kiểm tra bộ chọn mà không gửi yêu cầu
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)
}
}
Nếu muốn xem phép so sánh với môi trường, hãy chạy chương trình với các biến proxy được đặt cho tiến trình. Chương trình chỉ đánh giá các bộ chọn; nó không kết nối tới proxy minh họa trong tài liệu hay bất kỳ đích nào.
Tự tìm từ môi trường và bộ chọn tường minh là hai chính sách khác nhau
ProxyFromEnvironment xét lược đồ của đích, cài đặt môi trường và các quy tắc bỏ qua, bao gồm cách xử lý loopback đặc biệt. ProxyURL trả về URL proxy đã cung cấp cho mọi yêu cầu được đưa vào bộ chọn đó.
Vì vậy, một transport riêng với ProxyURL được chỉ định rõ có thể gửi yêu cầu tới đích cục bộ qua proxy. Điều này chỉ hữu ích khi proxy có thể truy cập hợp lệ tới đích được yêu cầu. localhost của proxy từ xa không phải localhost của máy tính xách tay của bạn, nên ép tuyến không tự động tạo thành phép thử kết nối hữu ích.
Kiểm tra trước khi tiến trình lưu môi trường vào bộ nhớ đệm
Cấu hình proxy theo môi trường của net/http chuẩn được lưu vào bộ nhớ đệm sau lần dùng đầu tiên. Sau đó đổi biến môi trường bên trong cùng chương trình đang chạy không phải cách đáng tin cậy để lặp lại phép thử với cấu hình mới. Hãy khởi động tiến trình mới với các giá trị mong muốn, hoặc cung cấp bộ chọn tường minh mà bạn kiểm soát hành vi.
Hành vi loopback này áp dụng cho bộ chọn proxy chuẩn của Go 1.27.3. Các ngôn ngữ và máy khách HTTP khác có thể dùng quy tắc định tuyến localhost khác.