微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NodeJS 路由是相对的还是根相对的,具体取决于用户代理

如何解决NodeJS 路由是相对的还是根相对的,具体取决于用户代理

我有一个带有此路由的 NodeJS 服务器:

require('log-timestamp');

router.get('/home',async (req,res) => {
  console.log(req.originalUrl," :: ",req.get('User-Agent'));
  console.log("Home: /home");
  res.render('home');
});

router.get("//home",(req,res) => {
  console.log("Buggy: //home");
  res.redirect("/home");
});

router.get("/",req.get('User-Agent'));
  console.log("Here: /");
  res.redirect("/home");
});

行为因用户代理而异。如果我在 Whatsapp 上共享网站的根目录,日志显示 NodeJS 复合路由并使它们相对于前一个/,然后 //home,然后 //home/home,然后 { {1}}):

[2020-12-19T13:18:51.159Z] /  ::  WhatsApp/2.2049.10 N
[2020-12-19T13:18:51.161Z] Here: /
GET / 302 7.251 ms - 27
[2020-12-19T13:18:51.412Z] Buggy: //home
GET //home 302 1.731 ms - 27
[2020-12-19T13:18:51.656Z] //home/home  ::  WhatsApp/2.2049.10 N
GET //home/home 404 435.474 ms - 6592
GET /images/logo_400x400_whatsapp_shared_image_EN.png 200 2.909 ms - 36671

如果我在浏览器中打开网站的根目录,日志会显示 日志显示 NodeJS 使用相对于站点根目录的每个路由(404,然后是 /):

[2020-12-19T13:22:12.745Z] /  ::  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:84.0) Gecko/20100101 Firefox/84.0
[2020-12-19T13:22:12.746Z] Here: /
GET / 302 1.476 ms - 54
[2020-12-19T13:22:12.893Z] /home  ::  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:84.0) Gecko/20100101 Firefox/84.0
[2020-12-19T13:22:12.927Z] Home: /home

该行为并不重要,因为 Whatsapp 只需要共享图片,而 404 页面确实包含该图片

为什么会这样?我该如何解决

解决方法

浏览器包括 converting relative URLs 的方式,例如 /home./img/logo.png 到它们的绝对等价物。像 https://example.com/homehttps://example.com/home/img/logo.png。这种相对到绝对的转换基于页面的 Base URL。默认基本 URL 为 document.href,即所显示页面的绝对 URL。

浏览器从绝对 URL 发出请求。查看 devtools 的 Network 选项卡以了解其工作原理。浏览器可以执行此操作,因为它们会在所呈现页面的上下文中解释超链接。

嵌入别处的超链接没有那种可用的基本 URL 上下文。所以相对 URL 不能转换为绝对形式。因此,嵌入在非浏览器用户代理中的 URL 必须都是绝对的。您的网络服务器(nodejs 程序)无法修复它们。

处理重定向也是浏览器的一项功能。像 WhatsApp 这样的非浏览器用户代理并不总是有必要的代码来接受和应用重定向。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。