CÓDIGO:
app.get("/:url", function(req,res) { var url = req.params.url; res.send(url); });PROBLEMA:
Esto no funciona.
Si intento:
http://localhost:3000/https://www.google.comYo obtengo:
Cannot GET /https://www.google.comPuedes probar esto, usando una expresión regular:
var app = require('express')(); app.get(/^\/(.*)/, function (req, res) { var url = req.params[0]; res.send(url); }); app.listen(3000, () => console.log('Listening on 3000'));Cuando corres:
curl http://localhost:3000/https://www.google.comel servidor debe devolver:
https://www.google.comExiste cierta controversia sobre si los dos puntos son legales o no en las URL.
Vea esta pregunta para más detalles:
Según RFC 3986, esta es una URL legal:
http://localhost:3000/https://tools.ietf.org/html/rfc3986Pero tenga en cuenta que si bien esto también es legal:
http://localhost:3000/https://tools.ietf.org/html/rfc3986#section-3.3si ingresó esa URL en el navegador, su servidor solo obtendría:
/https://tools.ietf.org/html/rfc3986en la solicitud. Por esa razón, aunque no es estrictamente necesario, aún recomendaría codificar la URL que coloca en otras URL; consulte la respuesta de Zac Delventhal .
Usando el ejemplo de código anterior, este comando:
curl http://localhost:3000/https://www.google.com/saldrá esto:
https://www.google.com/Pero este comando:
curl 'http://localhost:3000/https://www.google.com/#fragment'saldrá esto:
https://www.google.com/Tenga en cuenta que usé comillas simples arriba no porque sean necesarias aquí; no lo son, vea esto:
echo http://localhost:3000/https://www.google.com/#fragment pero para mostrar que el fragmento hash no desaparece porque el shell lo trata como un comentario en caso de que alguien pensara que esa podría ser la razón. No se envía incluso cuando se usan las comillas, y lo que sucede se puede demostrar con el -v de curl :
* Connected to localhost (127.0.0.1) port 3000 (#0) > GET /https://www.google.com/ HTTP/1.1 > User-Agent: curl/7.35.0 > Host: localhost:3000 > Accept: */*Como puede ver, el fragmento hash ni siquiera se envía con HTTP, por lo que es imposible que su servidor sepa que existió.
Por cierto, esto también demuestra que el uso de URL no codificadas dentro de otras URL no estropearía ningún proxy, porque las solicitudes HTTP a los servidores proxy envían esto:
GET https://www.google.com/ HTTP/1.1y no esto:
GET /https://www.google.com/ HTTP/1.1por lo que no se pueden confundir. (Observe la barra oblicua).
Esto se debe a que : y / son caracteres especiales que se utilizan para construir una URL. En otras palabras, no son seguros para URL . Si desea enviar esos caracteres como parte de una ruta URL, utilizando el analizador de parámetros Express predeterminado, debe codificarlos en porcentaje .
Prueba esto con tu código existente:
curl http://localhost:3000/https%3A%2F%2Fwww.google.comDeberías volver:
https://www.google.comOtra opción sería usar un parámetro de consulta en lugar de una variable de ruta. Modifique su fragmento de código ligeramente a esto:
app.get("*", function(req, res) { var url = req.query.url; res.send(url); });Luego, puedes probarlo con este comando:
curl http://localhost:3000?url=https://www.google.comY deberías volver:
https://www.google.comAunque diría que probablemente sea una buena idea codificar en porcentaje esos caracteres, aunque Express puede analizarlos bien de esta manera. Potencialmente podría conducir a un comportamiento extraño en el futuro.
Otra opción más sería enviar la url como una cadena en el cuerpo de una solicitud POST , pero eso puede no ser RESTful dependiendo de su caso de uso.