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
.
Respuestas:
El protocolo está disponible como
req.protocol
. documentos aquíhttp
menos 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.listen
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 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), elhost
encabezado 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,originalUrl
puede 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.host
que le da al host más la sección del puerto.host
parámetro en los encabezados de solicitud se puede suplantar. Hay un posible "ataque de encabezado de host" si se usa deres.host
esta 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_url
que se puede agregar a lareq.url
finalización. Sobre el ataque: skeletonscribe.net/2013/05/…req.originalUrl
sin 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 elhostname
campo 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.port
Usando 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-Host
El encabezado debe ser especificado por usted en el servidor web. p.ej. apache, nginxnginx :
apache :
fuente
127.0.0.1
dereq.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.protocol
Sugerirí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.protocol
le dará http o https,req.headers.host
le dará el nombre completo del host como www.google.com,req.originalUrl
le 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