Pełny adres URL nie jest przechowywany w miejscu, w którym można go uzyskać. Musisz zbudować go samodzielnie z części:
const url = request.connection.info.protocol + '://' + request.info.host + request.url.path
;
Chociaż może wydawać się to kludgey, ma sens, jeśli myślisz o tym, ponieważ nie ma oryginalnego, nieudokumentowanego, niezmodyfikowanego adresu URL:. Żądanie HTTP, który idzie przez przewód nie zawiera adres URL wpisany w pasku adresu przeglądarki, na przykład:
GET /hello?a=1&b=2 HTTP/1.1 // request.url.path
Host: localhost:4000 // request.info.host
Connection: keep-alive
Accept-Encoding: gzip, deflate, sdch
...
A znasz tylko protokół na podstawie tego, czy połączenie z serwerem Hapi jest w trybie TLS lub nie (request.connection.info.protocol
).
warte mieć świadomość
Jeśli zaznaczysz albo:
request.connection.info.uri
lub request.server.info.uri
raportowany hosta będzie hosta rzeczywistej maszynie, że serwer jest uruchomiony (the wyjście z hostname
na * nix). Jeśli chcesz rzeczywistego gospodarza osoba wpisana w przeglądarce (która może być inna) trzeba sprawdzić request.info.host
który jest analizowany z nagłówka Host żądanie HTTP)
proxy i X-Przekazano-Proto nagłówku
Jeśli Twoja prośba została przekazana przez serwer proxy lub kontroler równoważenia obciążenia/HTTPS, możliwe jest, że gdzieś po linii ruch HTTPS został zakończony i został wysłany na twój serwer przez połączenie HTTP, w tym przypadku musisz użyć wartości nagłówka x-forwarded-proto
, jeśli jest:
const url = (request.headers['x-forwarded-proto'] || request.connection.info.protocol) + '://' + request.info.host + request.url.path
;
z ciągami Szablon:
const url = `${request.headers['x-forwarded-proto'] || request.connection.info.protocol}://${request.info.host}${request.url.path}`;
Dobra uwaga na temat pierwotnego adresu URL i surowego żądania HTTP. – gilly3
'request.connection.info.protocol' nie jest tak dobrym rozwiązaniem. Jeśli potrzebujesz lepszego protokołu, użyj 'request.headers ['x-forwarded-proto']' – Petroff
@Petroff thanks, zaktualizowałem moją odpowiedź z notatką na temat serwerów proxy. –