Estoy haciendo un acortador de enlaces. Anteriormente tuve un problema con las URL, pero se solucionó al codificar la URL al colocarla en la base de datos y al redirigirla decodificará la URL y la redirigirá. El problema es que en lugar de redirigirme a https://google.com , me redirige a mypage.com/google.com. Intenté hacer una página de "depuración" cuando simplemente decodificó la URL y la URL está bien, con HTTPS: // y todo. El mayor problema es que todo funciona en localhost pero cuando lo implemento en mi VPS no funciona. Solo funciona la página de depuración que decodifica la URL. Estoy usando express.js y mangosta. Aquí está mi código para redirigir a los usuarios:
app.get('/:shortUrl', async (req, res) => { const shortUrl = await shorturl.findOne({ short: req.params.shortUrl }) if (shortUrl == null) { res.send('URL not found!') } else { shortUrl.clicks++ shortUrl.save() res.redirect(decodeURIComponent(shortUrl.full)) } })
Puede usar el objeto URL
incorporado para asegurarse de que la URL de redireccionamiento esté completa y sea válida:
res.redirect(new URL(decodeURIComponent(shortUrl.full)).toString())
Si no puede crear una URL válida a partir de la entrada, la arrojará, por lo que es mejor envolverla en un intento/captura.
try { res.redirect(new URL(decodeURIComponent(shortUrl.full)).toString()); } catch (e) { res.send('Invalid URL'); }
Si la URL no tiene un esquema, en un navegador asume que el esquema es HTTP, pero en las redirecciones HTTP, el dominio parece una ruta con un punto. Si redirige a una ruta, se redirigirá al mismo dominio, lo que explica el comportamiento con google.com
.
Intente normalizar la URL o validar que la URL completa incluye el esquema.
https://github.com/sindresorhus/normalize-url
https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL