在express中全局重定向所有尾随斜杠

2023-12-11

我正在使用 Node.js 和 Express,并且有以下路由:

app.get('/', function(req,res){
    locals.date = new Date().toLocaleDateString();

    res.render('home.ejs', locals);
});

function lessonsRouter (req, res, next)
{
    var lesson = req.params.lesson;
    res.render('lessons/' + lesson + '.ejs', locals_lessons);
}

app.get('/lessons/:lesson*', lessonsRouter);


function viewsRouter (req, res, next)
{
    var controllerName = req.params.controllerName;
    res.render(controllerName + '.ejs', locals_lessons);
}
app.get('/:controllerName', viewsRouter);

我有一个Disqus我的课程页面上的小部件,我注意到一个奇怪的行为,当去myapp.com/lessons and myapp.com/lessons/我得到两个不同的页面(其中一个有我之前在 Disqus 中添加的评论,另一个没有评论)。

有没有办法“规范”我的所有网址,使其不带尾部斜杠?我尝试添加strict routingflag来表达但结果是一样的

Thanks


答案 by 托尔加·阿克尤兹很鼓舞人心,但如果斜杠后面有任何字符则不起作用。例如http://example.com/api/?q=a被重定向到http://example.com/api代替http://example.com/api?q=a.

下面是建议的中间件的改进版本,它通过将原始查询添加到重定向目标 URL 的末尾来解决该问题。该版本还具有更新说明中描述的一些安全功能。

app.use((req, res, next) => {
  if (req.path.slice(-1) === '/' && req.path.length > 1) {
    const query = req.url.slice(req.path.length)
    const safepath = req.path.slice(0, -1).replace(/\/+/g, '/')
    res.redirect(301, safepath + query)
  } else {
    next()
  }
})

2016 年更新:正如所指出的jamesk并在RFC 1738,只有当域后面没有任何内容时才可以省略尾部斜杠。所以,http://example.com?q=a是一个无效的 URL,其中http://example.com/?q=a是有效的。在这种情况下,不应进行重定向。幸运的是,表达式req.path.length > 1照顾这个。例如,给定 URLhttp://example.com/?q=a, 路径req.path等于/从而避免了重定向。

2021 年更新:正如发现的Matt, 双斜杠//在路径的开头会导致危险的重定向。例如网址http://example.com//evil.example/创建一个重定向到//evil.example这被解释为http://evil.example or https://evil.example通过受害者的浏览器。另外,注意到范奎特,可以有多个应该妥善处理的尾部斜杠。由于这些发现,我添加了一行,通过将所有后续斜杠替换为单个斜杠来保护路径/。我相信防护措施造成的性能开销可以忽略不计,因为正则表达式文字仅编译一次。此外,代码语法更新为ES6。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在express中全局重定向所有尾随斜杠 的相关文章

随机推荐

  • 更改悬停时的背景图像

    图像的比例与该问题有关系吗 menu background black width 100 height 45px menu ul text decoration none list style type none menu li text
  • 将 UIImage 转换为 8 位

    我希望将 UIImage 转换为 8 位 我尝试这样做 但我不确定我是否做得正确 因为稍后当我尝试使用图像处理库 leptonica 时收到一条消息 指出它不是 8 位 谁能告诉我我是否正确执行此操作或如何执行此操作的代码 Thanks C
  • 将列表拆分为大小递减的子列表

    假设我有一个列表 list 0 1 2 3 我如何将列表分成类似的内容 new list 0 1 2 3 1 2 3 2 3 3 我尝试过使用 def change list new list for i in range len list
  • rPython 包无法在 R Shinyshinyapps.io 上安装

    shinyapps io 服务器没有安装 python 吗 因为包rPython安装失败 需要安装python 如果答案是否定的 我觉得很奇怪 因为 RStudio 本身有蟒蛇支持 shinyapps io 服务器是否支持 python 或
  • 在 Google Cloud Platform 存储桶上托管静态网站时的 DNS

    抱歉 如果我的问题看起来很混乱 我对 DNS 或托管只有一个基本的了解 故事是这样的 我创建了几个个人网页并注册了一个域名 然后我发现我的几个页面不需要 大 托管 最好在云中托管一个网站 我选择了 GCP 进行托管 发现this教程并遵循以
  • 拖动后标记位于地图中心

    我在我的网站上实现了谷歌地图 用户可以拖动标记并获取坐标 它工作正常 但要求是当用户拖动标记时 拖动标记后应该出现在地图窗口的中心 或者如果用户拖动地图 那么在这种情况下标记也出现在地图窗口的中心 我有以下代码 仅适用于地图上的拖动标记 但
  • 让 Flexbox 中的图像填充所有垂直空间并保持完全可见

    我需要在 div 左侧放置一个图像 并放置该图像 与 div 高度相同 其本身具有非固定的 与内容相关的高度 完全可见 保持其纵横比 Flexbox 似乎非常适合这项工作 但当将图像设置为 100 高度时 其尺寸保留自然宽度 内容会溢出到
  • centos 8,firewalld 错误`COMMAND_FAILED:'python-nftables'失败`[关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 当我尝试重新加载firewalld时 它告诉我 Error COMMAND FAILED python nftables failed internal 0 0 0 Error
  • appendChild 仅在第一次有效

    我想通过同一页面上的按钮和事件处理程序将相同的内容重复附加到元素 我遇到的问题是它只能在第一次使用 它第一次完全按照我想要的方式执行 然后在后续按下按钮时无法执行任何操作 我查了一下 似乎在第一个追加之后 newstuff innerHTM
  • 将 3D 模型安装在窗口内

    我想显示适合视图的不同尺寸的模型 以便整个模型在屏幕内可见 最好的方法是什么 我尝试使用此公式缩放 使用 glScale 模型 scaleFactor screenSize maxModelSize constant 其中尺寸是高度或宽度
  • 隐藏 Woocommerce 中特定用户角色的特定运输方式

    在 Woocommerce 中 我使用的是 WooCommerce Wholesale Pro Suite 来自IgniteWoo 以及统一费率盒子运输插件 将 B2B 添加到我们的网上商店 我正在尝试禁用特定用户角色 客人和客户的统一费率
  • Rails map.resources 与 has_many :through 不起作用?

    我有三个 相关的 模型 指定如下 class User lt ActiveRecord Base has many posts has many comments has many comments received through gt
  • .NET Maui - 重置 TabBar 项目单击上的导航

    我目前正在使用 NET Maui 想知道选项卡内的导航是如何工作的 我在文档中找不到我要找的内容 但如果我错过了 也许有人可以为我指出 所以目前我有一个带有两个底部选项卡的选项卡栏 第二个选项卡显示项目列表 当我单击一个项目时 我想显示一个
  • 使用 jq 将 JSON 转换为 CSV

    我有一个 json 文件 它存储在环境变量 temp 中 users username jack email email protected total running apps 1 api mock app 0 flogo 1 ipaas
  • Java 约定:在类中使用 getter/setter?

    我的教授非常强调通过始终使用访问器和修改器来访问私有实例变量来防止隐私泄露 但是 我是否必须在类中使用类的 getter setter 方法 举例来说 如果我有以下课程 public class Person private String
  • 使用 Anaconda 在 Google App Engine 上安装软件包?

    这个周末我制作了一个 Flask 应用程序 它使用了很多 ML 包 比如 Pytorch 模型都已经构建好了 所以我们不需要像 Google Compute Engine 这样疯狂的东西 但是 我仍然需要安装这些库 然而 其中许多 例如 P
  • 使用executeOnExecuter可以并行执行多少个?

    在我的应用程序中 当用户点击列表中的文档时 我需要提供文档的下载功能 因此 对于多个活动线程 AsyncTask 进入了我的脑海 但我也注意到人们并没有推荐 AsyncTask 来进行这种操作 因为在这种情况下大号没有 线程将在点击文档时开
  • @EnableMongoAuditing for MongoDB on Cloud Foundry / mongolab

    我的设置在本地有效 但在将其部署到 CloudFoundry mongolab 时无效 配置非常类似于docs 我本地的 spring 配置 Configuration Profile dev EnableMongoAuditing Ena
  • 这段 JavaScript 代码 getElementById 有什么问题吗?

    我下面有这个代码 div This is an example div 为什么它不起作用 该脚本在具有给定 id 的元素存在之前运行 并且您有一个DOM 属性名称其中有一个连字符 被视为减号运算符 div This is an exampl
  • 在express中全局重定向所有尾随斜杠

    我正在使用 Node js 和 Express 并且有以下路由 app get function req res locals date new Date toLocaleDateString res render home ejs loc