Zasadniczo, ponieważ masz dostęp do serwera HTTP a nie z serwera proxy HTTP, przeglądarka może wydać żądanie HTTP względne, tak:
GET/HTTP/1.1
Host: localhost:8080
(Biorąc pod uwagę, że, oczywiście, serwer nasłuchuje na porcie localhost 8080).
Teraz, jeśli zostały dostępie wspomniany serwer przy użyciu serwera proxy, proxy może używać bezwzględny adres URL:
GET http://localhost:8080/ HTTP/1.1
Host: localhost:8080
W obu przypadkach to, co otrzymujemy od Go http.Request.URL
jest surowy URL (jak analizowany przez biblioteka). W takim przypadku uzyskujesz dostęp do adresu URL z ścieżki względnej, stąd brak hosta lub schematu w obiekcie URL.
Jeśli chcesz uzyskać host HTTP, możesz uzyskać dostęp do atrybutu Host
struktury http.Request
. Patrz: http://golang.org/pkg/http/#Request
Możesz to sprawdzić, używając netcat
i odpowiednio sformatowanego żądania HTTP (możesz skopiować powyższe bloki, upewnij się, że w twoim pliku znajduje się końcowa pusta linia). Aby go wypróbować:
cat my-http-request-file | nc localhost 8080
Dodatkowo, można sprawdzić na serwerze/przewodnika, czy można uzyskać względną lub bezwzględną URL w żądaniu przez wywołanie metody IsAbs()
:
isAbsoluteURL := r.URL.IsAbs()
interesujące. Dzięki, że jesteś taki szczegółowy. Jest jednak trochę dziwne, że nie są one obecne podczas korzystania z serwera dev (domyślam się, że serwer programistyczny skonfigurowałby jakieś środowisko hosta do wypełnienia żądania). request.Host działał, ale używał adresu URL. Muszę sprawdzić warunkowo, czy serwer dev jest używany, czy nie. – moraes
Dzięki za odpowiedź! Czy możesz powiedzieć, jak temu zapobiec (ból głowy w analizie adresów URL)? Ponieważ nie mogę uzyskać schematu z obiektu Request :(Czy to jest normalne? –
Warto zauważyć, że czasami można wykryć boty w ten sposób (używają pełnego adresu URL podczas żądania strony) – Xeoncross