¿Cómo obtener la URL completa en Express?

Digamos que mi URL de muestra es

http://example.com/one/dos

y digo que tengo la siguiente ruta

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

El valor de url será /one/two .

¿Cómo obtengo la URL completa en Express? Por ejemplo, en el caso anterior, me gustaría recibir http://example.com/one/two .

  1. El protocolo está disponible como req.protocol . documentos aquí

    1. Antes de Express 3.0, el protocolo puede asumir que es http menos que vea que se ha establecido req.get('X-Forwarded-Protocol') y tiene el valor https , en cuyo caso usted sabe que ese es su protocolo
  2. El host proviene de req.get('host') como Gopal ha indicado

  3. Es de esperar que no necesite un puerto no estándar en sus URL, pero si lo necesitara, lo tendría en su estado de aplicación porque es lo que pasó a la app.listen en el momento del inicio del servidor. Sin embargo, en el caso del desarrollo local en un puerto no estándar, Chrome parece incluir el puerto en el encabezado del host, por lo que req.get('host') devuelve localhost:3000 , por ejemplo. Al menos para los casos de un sitio de producción en un puerto estándar y navegar directamente a su aplicación exprés (sin proxy inverso), el encabezado del host parece hacer lo correcto con respecto al puerto en la URL.

  4. La ruta proviene de req.originalUrl (gracias @pgrassant). Tenga en cuenta que esto incluye la cadena de consulta. docs aquí en req.url y req.originalUrl . Según lo que pretenda hacer con la URL, originalUrl puede ser o no el valor correcto en comparación con req.url .

Combina todo eso para reconstruir la URL absoluta.

  var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl; 

En lugar de concatenar las cosas por su cuenta, podría usar la API node.js para URL y pasar URL.format() las informaciones de express.

Ejemplo:

 var url = require('url'); function fullUrl(req) { return url.format({ protocol: req.protocol, host: req.get('host'), pathname: req.originalUrl }); } 

Encontré un poco un PITA para obtener la URL solicitada. No puedo creer que no haya una manera más fácil en express. Debería ser req.requested_url

Pero así es como lo configuré:

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

Usando url.format :

 var url = require('url'); 

Esto admite todos los protocolos e incluye el número de puerto. Si no tiene una cadena de consulta en su originalUrl, puede usar esta solución limpiadora:

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

Si tiene una cadena de consulta:

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

Aquí hay una excelente forma de agregar una función a la que puede llamar en el objeto de solicitud para obtener la URL

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

Ahora tiene una función a la que puede llamar si la necesita.

make req.host/req.hostname efectivo debe tener dos condiciones cuando Express detrás de los proxies :

  1. app.set('trust proxy', 'loopback'); en app.js
  2. X-Forwarded-Host encabezado X-Forwarded-Host debe ser especificado por usted en el servidor web. p.ej. 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 :

  ServerName myhost DocumentRoot /path/to/myapp/public ProxyPass / http://myapp:8080/ ProxyPassReverse / http://myapp:8080/  

Utilizar esta,

 var url = req.headers.host + '/' + req.url; 

Necesitas construirlo usando req.headers.host + req.url . Por supuesto, si está alojando en un puerto diferente y así se entiende 😉

Mi código se ve así,

params['host_url'] = req.protocol + '://' + req.headers.host + req.url;

Sugeriría utilizar originalUrl en lugar de URL:

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

Consulte la descripción de originalUrl aquí: http://expressjs.com/api.html#req.originalUrl

En nuestro sistema, hacemos algo como esto, por lo que originalUrl es importante para nosotros:

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

blah_controller se ve así:

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

Entonces nuestras URL tienen el formato:

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

Por lo tanto, necesitamos req.originalUrl en el controlador de barras get handler.

 var full_address = req.protocol + "://" + req.headers.host + req.originalUrl; 

o

 var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;` 

Uso el paquete de nodos ‘url’ (npm install url)

Lo que hace es cuando llamas

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

le dará la posibilidad de recuperar todo o parte de la url. Más información aquí: https://github.com/defunctzombie/node-url

Lo utilicé de la siguiente manera para obtener lo que venga después del / en http://www.example.com/ para usar como una variable y obtener un perfil en particular (tipo de Facebook: http: //www.facebook. com / nombre de usuario )

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

Aunque para que esto funcione, debe crear su ruta de esta manera en su archivo server.js:

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

Y configure su archivo de ruta de esta manera:

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

De hecho, descubrí que al usar este código a continuación, puede obtener su url. Luego proceda a cortarlo y decidir qué sigue.

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