web-dev-qa-db-fra.com

Comment obtenir l'URL complète dans Express?

Disons que mon exemple d'URL est

http://example.com/one/two

et je dis que j'ai l'itinéraire suivant

app.get('/one/two', function (req, res) {
    var url = req.url;
}

La valeur de url sera /one/two.

Comment puis-je obtenir l'URL complète dans Express? Par exemple, dans le cas ci-dessus, j'aimerais recevoir http://example.com/one/two.

420
Chris Abrams
  1. Le protocole est disponible sous la forme req.protocol. docs ici

    1. Avant Express 3.0, le protocole que vous pouvez supposer être http, sauf si vous voyez que req.get('X-Forwarded-Protocol') est défini et a la valeur https, auquel cas vous savez que c'est votre protocole.
  2. L'hôte vient de req.get('Host') comme Gopal l'a indiqué

  3. J'espère que vous n'avez pas besoin d'un port non standard dans vos URL, mais si vous aviez besoin de le savoir, vous l'avez dans l'état de votre application, car c'est ce que vous avez transmis à app.listen au moment du démarrage du serveur. Toutefois, dans le cas du développement local sur un port non standard, Chrome semble inclure le port dans l'en-tête de l'hôte, de sorte que req.get('Host') renvoie localhost:3000, par exemple. Ainsi, au moins pour les cas d'un site de production sur un port standard et pour la navigation directe vers votre application express (sans proxy inverse), l'en-tête Host semble faire le bon choix en ce qui concerne le port dans l'URL.

  4. Le chemin vient de req.originalUrl (merci @pgrassant). Notez que ceci inclut la chaîne de requête. docs ici sur req.url et req.originalUrl . Selon ce que vous avez l'intention de faire avec l'URL, originalUrl peut être ou ne pas être la valeur correcte par rapport à req.url.

Combinez ces éléments pour reconstruire l'URL absolue.

  var fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl;
648
Peter Lyons

Au lieu de concaténer les éléments vous-même, vous pouvez utiliser l'API node.js pour les URL et transmettre URL.format() les informations expresse.

Exemple:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    Host: req.get('Host'),
    pathname: req.originalUrl
  });
}
112
Michael Weibel

J'ai trouvé un peu d'un PITA pour obtenir l'URL demandée. Je n'arrive pas à croire qu'il n'y a pas de moyen plus simple d'exprimer. Devrait juste être req.requested_url

Mais voici comment je l'ai réglé:

var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.Host  + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
32
chovy

Utilisation de rl.format :

var url = require('url');

Ceci supporte tous les protocoles et inclut le numéro de port. Si vous n'avez pas de chaîne de requête dans votre originalUrl, vous pouvez utiliser cette solution de nettoyage:

var requrl = url.format({
    protocol: req.protocol,
    Host: req.get('Host'),
    pathname: req.originalUrl,
});

Si vous avez une chaîne de requête:

var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.Host = req.get('Host');
var requrl = url.format(urlobj);
17
mpolci

Voici un excellent moyen d'ajouter une fonction que vous pouvez appeler sur l'objet req pour obtenir l'URL

  app.use(function(req, res, next) {
    req.getUrl = function() {
      return req.protocol + "://" + req.get('Host') + req.originalUrl;
    }
    return next();
  });

Maintenant, vous avez une fonction que vous pouvez appeler à la demande si vous en avez besoin.

15

Utilisez ceci,

var url = req.headers.Host + '/' + req.url;
9
Vaghani Janak

make req.Host/req.hostname effective doit avoir deux conditions lorsque exprimer derrière les proxies :

  1. app.set('trust proxy', 'loopback'); dans app.js
  2. X-Forwarded-Host l'en-tête doit être spécifié par votre propriétaire dans le serveur Web. par exemple. Apache, nginx

nginx :

server {
    listen myhost:80;
    server_name  myhost;
    location / {
        root /path/to/myapp/public;
        proxy_set_header X-Forwarded-Host $Host:$server_port;
        proxy_set_header X-Forwarded-Server $Host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myapp:8080;
    }
}

Apache :

<VirtualHost myhost:80>
    ServerName myhost
    DocumentRoot /path/to/myapp/public
    ProxyPass / http://myapp:8080/
    ProxyPassReverse / http://myapp:8080/
</VirtualHost>
9
zhi.yang
var full_address = req.protocol + "://" + req.headers.Host + req.originalUrl;

ou

var full_address = req.protocol + "://" + req.headers.Host + req.baseUrl;
6
mlibre

Je suggère d'utiliser originalUrl au lieu de l'URL:

var url = req.protocol + '://' + req.get('Host') + req.originalUrl;

Voir la description de originalUrl ici: http://expressjs.com/api.html#req.originalUrl

Dans notre système, nous faisons quelque chose comme ça, donc originalUrl est important pour nous:

  foo = express();
  express().use('/foo', foo);
  foo.use(require('/foo/blah_controller'));

blah_controller ressemble à ceci:

  controller = express();
  module.exports = controller;
  controller.get('/bar/:barparam', function(req, res) { /* handler code */ });

Donc, nos URL ont le format:

www.example.com/foo/bar/:barparam

Par conséquent, nous avons besoin de req.originalUrl dans le gestionnaire de commandes get.

6
Amber Haq Dixon

Mon code ressemble à ceci,

params['Host_url'] = req.protocol + '://' + req.headers.Host + req.url;

6
soomtong

Vous devez le construire en utilisant req.headers.Host + req.url. Bien sûr, si vous hébergez dans un autre port et que vous en avez une idée ;-)

6
g13n

J'utilise le package de nœud 'url' (npm install url)

Qu'est-ce que c'est quand vous appelez

url.parse(req.url, true, true)

cela vous donnera la possibilité de récupérer tout ou partie de l'URL. Plus d'infos ici: https://github.com/defunctzombie/node-url

Je l'ai utilisé de la manière suivante pour que tout ce qui suit après le/in http://www.example.com/ soit utilisé comme variable et affiche un profil particulier (un peu comme facebook: - http://www.facebook.com/username )

    var url = require('url');
    var urlParts = url.parse(req.url, true, true);
    var pathname = urlParts.pathname;
    var username = pathname.slice(1);

Cependant, pour que cela fonctionne, vous devez créer votre itinéraire de cette manière dans votre fichier server.js:

self.routes['/:username'] = require('./routes/users');

Et définissez votre fichier de route comme suit:

router.get('/:username', function(req, res) {
 //here comes the url parsing code
}
5
Sacha Nacar

J'ai en fait découvert qu'en utilisant ce code ci-dessous, vous pouvez obtenir votre URL. Ensuite, procédez à la découpe et à la décision.

app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
  });
1
Kennedy Nyaga

Merci à tous pour cette information. C'est incroyablement ennuyant.

Ajoutez ceci à votre code et vous n'aurez plus jamais à y penser:

var app = express();

app.all("*", function (req, res, next) {  // runs on ALL requests
    req.fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl
        next()
})

Vous pouvez également définir ou définir d'autres éléments, tels que consigner dans la console.

0
Nico