【问题标题】:when i try to redirect to decoded url it will redirect me to my myurl.com/myurl instead taking me to the page当我尝试重定向到解码的 url 时,它会将我重定向到 myurl.com/myurl 而不是将我带到页面
【发布时间】:2021-12-29 23:30:21
【问题描述】:

我正在制作链接缩短器。我之前遇到了 URL 的问题,但是在将 URL 放入数据库时​​对 URL 进行了编码,并且在重定向时它会解码 URL 并重定向到它。问题是,它没有将我重定向到喜欢https://google.com,而是将我重定向到 mypage.com/google.com。我尝试制作一个“调试”页面,它只是解码 URL 并且 URL 很好,带有 HTTPS:// 和所有内容。最大的问题是它都在 localhost 上运行,但是当我在我的 VPS 上部署它时它不起作用。只有解码 URL 的调试页面有效。我正在使用 express.js 和猫鼬。这是我重定向用户的代码:

    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))
    }
})

【问题讨论】:

  • 您在 URL 的开头缺少 //,因此它会将其视为您页面中的相对 URL。
  • @Barmar 在解码后的 URL 中有 //。但是当我尝试重定向到它时它只是“消失”
  • 尝试res.redirect(new URL(decodeURIComponent(shortUrl.full)).toString()) 以确保安全
  • 请显示console.log(decodeURIComponent(shortUrl.full))的输出
  • // 必须在 https: 这样的方案的开头或之后

标签: javascript api express mongoose decoding


【解决方案1】:

您可以使用内置的URL 对象来确保重定向 URL 完整且有效:

res.redirect(new URL(decodeURIComponent(shortUrl.full)).toString())

如果无法从输入中生成有效的 URL,它会抛出异常,因此最好将其包装在 try/catch 中。

try {
  res.redirect(new URL(decodeURIComponent(shortUrl.full)).toString());
} catch (e) {
  res.send('Invalid URL');
}

【讨论】:

    【解决方案2】:

    如果 URL 没有方案,则在浏览器中它假定方案是 HTTP,但在 HTTP 重定向中,域看起来像带点的路径。如果您重定向到某个路径,它将重定向到同一个域,这解释了 google.com 的行为。

    尝试规范化 URL 或验证完整的 URL 是否包含方案。

    https://github.com/sindresorhus/normalize-url

    https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 2016-08-28
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多