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 urlserá /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.

Respuestas:
El protocolo está disponible como
req.protocol. documentos aquíhttpmenos que vea quereq.get('X-Forwarded-Protocol')está configurado y tiene el valorhttps, en cuyo caso sabe que ese es su protocoloEl host proviene de lo
req.get('host')que Gopal ha indicadoEspero que no necesite un puerto no estándar en sus URL, pero si necesita saberlo, lo tendrá en el estado de su aplicación porque es lo que haya pasado al
app.listenmomento 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 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 navegando directamente a su aplicación express (sin proxy inverso), elhostencabezado parece hacer lo correcto con respecto al puerto en la URL.El camino viene de
req.originalUrl(gracias @pgrassant). Tenga en cuenta que esto INCLUYE la cadena de consulta. documentos aquí en req.url y req.originalUrl . Dependiendo de lo que pretenda hacer con la URL,originalUrlpuede o no ser el valor correcto en comparación conreq.url.Combina todos esos elementos para reconstruir la URL absoluta.
fuente
req.get('Host')lugar de loreq.hostque le da al host más la sección del puerto.hostparámetro en los encabezados de solicitud se puede suplantar. Hay un posible "ataque de encabezado de host" si se usa deres.hostesta manera. En el marco de Django, tienen una variable de "hosts permitidos" que se utiliza para prevenir dicho ataque. Yo uso una variable de configuración que es miroot_urlque se puede agregar a lareq.urlfinalización. Sobre el ataque: skeletonscribe.net/2013/05/…req.originalUrlsin parámetros, simplemente hágaloreq.originalUrl.split("?").shift(). Fuente: stackoverflow.com/a/32118818/2037431En lugar de concatenar las cosas por su cuenta, podría usar la API de node.js para URL y pasar
URL.format()la información de express.Ejemplo:
fuente
req.get('host')solo devuelve la parte del nombre de host , no el puerto. No sé por qué, pero ahora obtengo el número de puerto de la configuración y uso elhostnamecampo en lugar dehost.pathname, creo que te refierespath. Que incluye búsqueda / cadena de consultaMe pareció un poco PITA obtener la URL solicitada. No puedo creer que no haya una manera más fácil de expresar. Debería ser solo req.requested_url
Pero así es como lo configuro:
fuente
req.port? ¿No está en la documentación Express?req.app.settings.portUsando url.format :
Esto admite todos los protocolos e incluye el número de puerto. Si no tiene una cadena de consulta en su URL original, puede usar esta solución más limpia:
Si tiene una cadena de consulta:
fuente
Aquí hay una excelente manera de agregar una función que puede invocar en el objeto req para obtener la URL
Ahora tiene una función a la que puede llamar bajo demanda si la necesita.
fuente
hacer que req.host/req.hostname sea efectivo debe tener dos condiciones cuando Express detrás de proxies :
app.set('trust proxy', 'loopback');en app.jsX-Forwarded-HostEl encabezado debe ser especificado por usted en el servidor web. p.ej. apache, nginxnginx :
apache :
fuente
127.0.0.1dereq.get('host')Utilizar este,
fuente
o
fuente
Necesitas construirlo usando
req.headers.host + req.url. Por supuesto, si está alojado en un puerto diferente y de este modo se le ocurre la idea ;-)fuente
req.protocolSugeriría usar originalUrl en lugar de URL:
Vea 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:
blah_controller se ve así:
Entonces nuestras URL tienen el formato:
Por lo tanto, necesitamos req.originalUrl en el controlador de barra get get.
fuente
Mi código se ve así,
params['host_url'] = req.protocol + '://' + req.headers.host + req.url;fuente
Yo uso el paquete de nodos 'url' (npm install url)
Lo que hace es cuando llamas
le dará la posibilidad de recuperar todas o partes de la url. Más información aquí: https://github.com/defunctzombie/node-url
Lo utilicé de la siguiente manera para obtener lo que viene después de / en http://www.example.com/ para usarlo como una variable y extraer un perfil en particular (algo así como Facebook: http: //www.facebook. com / username )
Aunque para que esto funcione, debe crear su ruta de esta manera en su archivo server.js:
Y configure su archivo de ruta de esta manera:
fuente
Puedes usar esta función en la ruta como esta
req.protocolle dará http o https,req.headers.hostle dará el nombre completo del host como www.google.com,req.originalUrlle dará el restopathName(en su caso/one/two)fuente
Gracias a todos por esta información. Esto es increíblemente molesto.
Agregue esto a su código y nunca tendrá que pensarlo nuevamente:
También puede hacer o configurar otras cosas allí, como iniciar sesión en la consola.
fuente
¡Solo el código a continuación fue suficiente para mí!
fuente