web-dev-qa-db-fra.com

Comment obtenir l'URL complète pour une demande en Hapi

Dans mon application hapijs, à l'aide d'un objet Request , comment puis-je trouver l'URL d'origine, non analysée et non modifiée?

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

J'ai découvert que je pouvais le rassembler un peu à partir de Request.info.Host, Request.path et Request.query, mais il manque le schéma (c'est-à-dire, http vs https), et c'est un peu superficiel. L'URL ordinaire n'est-il pas disponible quelque part?

15
gilly3

L'URL complète n'est pas stockée quelque part, vous pouvez l'obtenir. Vous devez le construire vous-même à partir des parties:

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

Même si cela peut sembler kludgey, cela a du sens si vous y réfléchissez parce que il n’existe pas d’URL originale, non analysée, non modifiée . La demande HTTP qui passe par le fil ne contient pas l'URL telle que saisie dans la barre d'adresse du navigateur, par exemple:

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

Et vous ne connaissez que le protocole selon que la connexion au serveur HAPI est en mode TLS ou non (request.connection.info.protocol).

Ce qu'il faut savoir

Si vous cochez soit:

request.connection.info.uri ou request.server.info.uri

le nom d'hôte signalé sera le nom d'hôte de la machine sur laquelle le serveur est exécuté (la sortie de hostname sur * nix). Si vous voulez que l'hôte réel saisi par la personne dans le navigateur (qui peut être différent), vous devez cocher request.info.Host qui est analysé à partir de l'en-tête de l'hôte de la requête HTTP)

Proxies et en-tête X-Forwarded-Proto

Si votre demande a été transmise via un proxy/des équilibreurs de charge/des terminateurs HTTPS, il est possible que le trafic HTTPS se soit arrêté et envoyé à votre serveur via une connexion HTTP. Dans ce cas, vous souhaiterez utiliser la valeur de l'en-tête x-forwarded-proto s'il est là:

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

Avec des chaînes de template:

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

hapi-url résout ce problème. Il est prêt à utiliser des en-têtes X-Forwarded pour s'exécuter derrière un proxy. Il existe également une option permettant de remplacer la résolution automatique si la bibliothèque ne parvient pas à résoudre correctement l'URL.

1
rigon

J'utilise maintenant la syntaxe suivante (en utilisant le script coffee):

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

Ou en 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);
});

Cela vous donne l'URL exacte telle que demandée par l'utilisateur.

0
Alinex

Vous ne pouvez pas obtenir l'URL. Vous devez le générer. J'utilise celui-ci:

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