node.js - route - ¿Cómo obtener la url completa en Express?
req.query express (13)
El protocolo está disponible como
req.protocol
. docs aquí- Antes de Express 3.0, el protocolo puede asumir que es
http
menos que vea quereq.get(''X-Forwarded-Protocol'')
está establecido y tiene el valorhttps
, en cuyo caso sabe que ese es su protocolo.
- Antes de Express 3.0, el protocolo puede asumir que es
El host proviene de
req.get(''host'')
como Gopal ha indicadoEs de esperar que no necesite un puerto no estándar en sus URL, pero si necesita saberlo, lo tendrá en su estado de aplicación porque es lo que pasó a
app.listen
en el momento de 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 quereq.get(''host'')
devuelvelocalhost:3000
, por ejemplo. Entonces, al menos para los casos de un sitio de producción en un puerto estándar y para navegar directamente a su aplicación Express (sin proxy inverso), el encabezado delhost
parece hacer lo correcto con respecto al puerto en la URL.El camino proviene de
req.originalUrl
(gracias @pgrassant). Tenga en cuenta que esto incluye la cadena de consulta. docs aquí en req.url y req.originalUrl . Dependiendo de lo que intente hacer con la URL,originalUrl
puede o no ser el valor correcto en comparación conreq.url
.
Combina todos juntos para reconstruir la URL absoluta.
var fullUrl = req.protocol + ''://'' + req.get(''host'') + req.originalUrl;
Digamos que mi url de muestra es
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
.
De hecho, descubrí que al usar este código a continuación puedes obtener tu url. Luego procede a cortarlo y decidir qué es lo siguiente.
app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
});
En lugar de concatenar las cosas por su cuenta, puede utilizar la API node.js para las URL y pasar la 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 de un PITA para obtener la url solicitada. No puedo creer que no haya una manera más fácil de expresar. Debería ser req.requested_url
Pero así es como lo configuro:
var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + ''://'' + req.host + ( port == 80 || port == 443 ? '''' : '':''+port ) + req.path;
Esta es una excelente manera de agregar una función a la que puede llamar en el objeto req 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 lo necesita.
Mi código se parece a esto,
params[''host_url''] = req.protocol + ''://'' + req.headers.host + req.url;
Necesitas construirlo usando req.headers.host + req.url
. Por supuesto, si usted está alojando en un puerto diferente y así se le ocurre la idea ;-)
Usando url.format :
var url = require(''url'');
Esto soporta todos los protocolos e incluye número de puerto. Si no tiene una cadena de consulta en su originalUrl puede usar esta solución más limpia:
var requrl = url.format({
protocol: req.protocol,
host: req.get(''host''),
pathname: req.originalUrl,
});
Si tienes una cadena de consulta:
var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.host = req.get(''host'');
var requrl = url.format(urlobj);
Uso el paquete de nodo ''url'' (npm install url)
Lo que hace es cuando llamas.
url.parse(req.url, true, true)
le dará la posibilidad de recuperar todo o partes de la url. Más información aquí: https://github.com/defunctzombie/node-url
Lo usé de la siguiente manera para obtener lo que venga después de / en http://www.example.com/ para usarlo como variable y mostrar un perfil en particular (como 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);
Aunque para que esto funcione, debe crear su ruta de esta manera en su archivo server.js:
self.routes[''/:username''] = require(''./routes/users'');
Y configura tu archivo de ruta de esta manera:
router.get(''/:username'', function(req, res) {
//here comes the url parsing code
}
Utilizar esta,
var url = req.headers.host + ''/'' + req.url;
Yo sugeriría usar 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 */ });
Así que nuestras URL tienen el formato:
www.example.com/foo/bar/:barparam
Por lo tanto, necesitamos req.originalUrl en la barra del controlador get.
hacer req.host/req.hostname efectivo debe tener dos condiciones cuando Express detrás de los proxies :
-
app.set(''trust proxy'', ''loopback'');
en app.js -
X-Forwarded-Host
encabezadoX-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
<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;
o
var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;`