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?
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}`;
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.
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.
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;