Disons que mon exemple d'URL est
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
.
Le protocole est disponible sous la forme req.protocol
. docs ici
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.L'hôte vient de req.get('Host')
comme Gopal l'a indiqué
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.
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;
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
});
}
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;
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);
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.
Utilisez ceci,
var url = req.headers.Host + '/' + req.url;
make req.Host/req.hostname effective doit avoir deux conditions lorsque exprimer derrière les proxies :
app.set('trust proxy', 'loopback');
dans app.jsX-Forwarded-Host
l'en-tête doit être spécifié par votre propriétaire dans le serveur Web. par exemple. Apache, nginxnginx :
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>
var full_address = req.protocol + "://" + req.headers.Host + req.originalUrl;
ou
var full_address = req.protocol + "://" + req.headers.Host + req.baseUrl;
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.
Mon code ressemble à ceci,
params['Host_url'] = req.protocol + '://' + req.headers.Host + req.url;
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 ;-)
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
}
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);
});
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.