Về cơ bản, vì bạn đang truy cập vào máy chủ HTTP không phải từ một proxy HTTP, một trình duyệt có thể phát hành một yêu cầu HTTP tương đối, như vậy:
GET/HTTP/1.1
Host: localhost:8080
(Cho rằng, tất nhiên, máy chủ đang lắng nghe trên cổng localhost 8080).
Bây giờ, nếu bạn đang truy cập vào nói máy chủ sử dụng một proxy, proxy có thể sử dụng một URL tuyệt đối:
GET http://localhost:8080/ HTTP/1.1
Host: localhost:8080
Trong cả hai trường hợp, những gì bạn nhận được từ Go http.Request.URL
được URL thô (như phân tích của thư viện). Trong trường hợp bạn đang nhận được, bạn đang truy cập URL từ một đường dẫn tương đối, do đó thiếu một Host hoặc Scheme trong đối tượng URL.
Nếu bạn muốn nhận máy chủ HTTP, bạn có thể muốn truy cập thuộc tính Host
của cấu trúc http.Request
. Xem http://golang.org/pkg/http/#Request
Bạn có thể xác thực bằng cách sử dụng netcat
và yêu cầu HTTP được định dạng phù hợp (bạn có thể sao chép các khối ở trên, đảm bảo có dòng trống sau trong tệp của bạn). Để thử nó ra:
cat my-http-request-file | nc localhost 8080
Ngoài ra, bạn có thể kiểm tra trong máy chủ/handler cho dù bạn có được một URL tương đối hoặc tuyệt đối trong yêu cầu bằng cách gọi phương pháp IsAbs()
:
isAbsoluteURL := r.URL.IsAbs()
Thú vị. Cảm ơn bạn đã quá chi tiết. Đó là một chút lạ tuy nhiên rằng những người không có mặt trong khi sử dụng máy chủ dev (tôi đoán rằng các máy chủ phát triển sẽ thiết lập một số loại môi trường máy chủ để điền vào yêu cầu). request.Host đã làm việc nhưng để sử dụng URL.Scheme tôi sẽ cần phải kiểm tra có điều kiện nếu máy chủ dev đang được sử dụng hay không. – moraes
Cảm ơn bạn đã trả lời! Bạn có thể cho biết cách ngăn chặn hành vi này (nhức đầu để phân tích cú pháp URL) không? Bởi vì tôi thậm chí không thể có được kế hoạch từ đối tượng Yêu cầu: (Điều này có bình thường không? –
Điều đáng chú ý là đôi khi bạn có thể phát hiện bot theo cách này (họ sử dụng URL đầy đủ khi yêu cầu một trang) – Xeoncross