2015-08-05 34 views
13

W mojej aplikacji hapijs, biorąc pod uwagę Request object, w jaki sposób mogę znaleźć oryginalny, nieudokumentowany, niezmodyfikowany adres URL?Jak uzyskać pełny adres URL żądania w Hapi

function getRequestUrl (request) { 
    return ...; // What goes here? 
} 

Odkryłem, że mogę poskładać je razem nieco od Request.info.host, Request.path i Request.query, ale brakuje programu (czyli http vs https) i jest trochę kludge. Czy nie jest dostępny zwykły URL?

Odpowiedz

28

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}`; 
+1

Dobra uwaga na temat pierwotnego adresu URL i surowego żądania HTTP. – gilly3

+0

'request.connection.info.protocol' nie jest tak dobrym rozwiązaniem. Jeśli potrzebujesz lepszego protokołu, użyj 'request.headers ['x-forwarded-proto']' – Petroff

+0

@Petroff thanks, zaktualizowałem moją odpowiedź z notatką na temat serwerów proxy. –

0

użyć następującej składni teraz (za pomocą coffeescript):

server.on 'response', (data) -> 
    raw = data.raw.req 
    url = "#{data.connection.info.protocol}://#{raw.headers.host}#{raw.url}" 
    console.log "Access to #{url}" 

Albo jak javascript:

​server.on('response', function(data) { 
    var raw = data.raw.req; 
    var url = data.connection.info.protocol + "://" + 
    raw.headers.host + raw.url; 
    console.log("Access to " + url); 
}); 

To daje dokładny adres URL, jak użytkownik o to.

0

Nie można uzyskać adresu URL. Musisz to wygenerować. Używam tego:

const url = request.headers['x-forwarded-proto'] + '://' + 
      request.headers.host + 
      request.url.path;