it-swarm.com.de

So erhalten Sie die vollständige URL für eine Anfrage in Hapi

Wie finde ich in meiner hapijs-App mit einem Request-Objekt die ursprüngliche, nicht geparste, unveränderte URL?

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

Ich habe herausgefunden, dass ich etwas aus Request.info.Host, Request.path und Request.query zusammensetzen kann, aber es fehlt das Schema (dh http vs https) und ist ein bisschen kludge. Ist die einfache URL nicht irgendwo verfügbar?

15
gilly3

Die vollständige URL wird nicht irgendwo gespeichert, wo Sie sie bekommen können. Sie müssen es selbst aus den Teilen bauen:

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

Obwohl es kludgey erscheinen mag, ist es sinnvoll, wenn Sie darüber nachdenken, weil es gibt keine ursprüngliche, nicht geparste, unveränderte URL . Die HTTP-Anforderung, die über die Verbindung gesendet wird, enthält nicht die URL, die in die Adressleiste des Browsers eingegeben wurde, beispielsweise:

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

Das Protokoll ist nur abhängig davon, ob sich die Verbindung des Hapi-Servers im TLS-Modus befindet oder nicht (request.connection.info.protocol).

Dinge, die man beachten sollte

Wenn Sie einen der folgenden Punkte überprüfen:

request.connection.info.uri oder request.server.info.uri

der gemeldete Hostname ist der Hostname des aktuellen Computers, auf dem der Server ausgeführt wird (die Ausgabe von hostname bei * nix). Wenn Sie möchten, dass der eigentliche Host die im Browser eingegebene Person ist (die möglicherweise anders ist), müssen Sie request.info.Host überprüfen, der aus dem Hostheader der HTTP-Anforderung analysiert wird.

Proxies und X-Forwarded-Proto-Header

Wenn Ihre Anforderung über einen Proxy (e)/Load Balancer/HTTPS-Abschlusswiderstände weitergeleitet wurde, ist es möglich, dass der HTTPS-Datenverkehr irgendwann beendet wurde und über eine HTTP-Verbindung an Ihren Server gesendet wurde. In diesem Fall sollten Sie den Wert von verwenden der x-forwarded-proto-Header, falls vorhanden:

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

Mit Template-Strings:

const url = `${request.headers['x-forwarded-proto'] || request.connection.info.protocol}://${request.info.Host}${request.url.path}`;
34
Matt Harrison

hapi-url löst genau dieses Problem. Es ist bereit, mit X-Forwarded-Headern zu arbeiten, um hinter einem Proxy zu laufen. Es gibt auch eine Option zum Überschreiben der automatischen Auflösung, wenn die Bibliothek die URL nicht richtig auflösen kann.

1
rigon

Ich verwende jetzt die folgende Syntax (Kaffee-Skript):

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

Oder als 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);
});

Dadurch erhalten Sie genau die URL, die der Benutzer angefordert hat.

0
Alinex

Sie können die URL nicht erhalten. Sie müssen es generieren. Ich verwende dieses:

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