2015-08-05 11 views
13

Nella mia app di hapijs, data una Request object, come posso trovare l'URL originale, non analizzato, non modificato?Come ottenere l'URL completo per una richiesta in Hapi

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

ho trovato che posso piece insieme un po 'dalla Request.info.host, Request.path, e Request.query, ma manca del regime (vale a dire, http o https), ed è un po' un kludge. L'URL semplice non è disponibile da qualche parte?

risposta

28

L'URL completo non è memorizzato da qualche parte è possibile ottenerlo. È necessario crearlo autonomamente dalle parti:

const url = request.connection.info.protocol + '://' + request.info.host + request.url.path;

Anche se può sembrare un gioco da ragazzi, ha senso se ci si pensa perché non esiste un URL originale, non modificato, non modificato. La richiesta HTTP che va oltre il filo non contiene l'URL come digitato nella barra degli indirizzi del browser per esempio:

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 
... 

E si sa solo il protocollo in base al fatto la connessione al server Hapi è in modalità TLS o no (request.connection.info.protocol).

cose di essere a conoscenza di

Se si seleziona uno:

request.connection.info.uri o request.server.info.uri

l'hostname riportato sarà il nome host della macchina reale che il server è in esecuzione (la uscita di hostname su * nix). Se si desidera che l'host effettivo della persona digitato nel browser (che potrebbe essere diverso) è necessario controllare request.info.host che viene analizzato dal intestazione host della richiesta HTTP)

Proxy e X-Forwarded-Proto intestazione

Se la tua richiesta è passata attraverso un proxy (i)/load balancers/terminatori HTTPS, è possibile che qualche parte del traffico HTTPS sia terminato e che sia stato inviato al tuo server su una connessione HTTP, in questo caso dovrai usare il valore dell'intestazione x-forwarded-proto se è presente:

const url = (request.headers['x-forwarded-proto'] || request.connection.info.protocol) + '://' + request.info.host + request.url.path;

con stringhe di modello:

const url = `${request.headers['x-forwarded-proto'] || request.connection.info.protocol}://${request.info.host}${request.url.path}`; 
+1

Buon punto sull'URL originale e sulla richiesta HTTP non elaborata. – gilly3

+0

'request.connection.info.protocol' non è la soluzione migliore. Se hai bisogno di usare meglio il protocollo 'request.headers ['x-forwarded-proto']' – Petroff

+0

@Petroff ringrazia, aggiorna la mia risposta con una nota sui proxy. –

0

Io uso la seguente sintassi ora (utilizzando lo script del caffè):

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

O come 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); 
}); 

che ti dà l'URL esatta come l'utente ha richiesto.

0

Non è possibile ottenere l'URL. Devi generarlo. Sto usando questo:

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