2011-08-01 16 views

Odpowiedz

45

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() 
+0

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

+3

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? –

+0

Warto zauważyć, że czasami można wykryć boty w ten sposób (używają pełnego adresu URL podczas żądania strony) – Xeoncross

Powiązane problemy