You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Express为URL路由添加末尾斜杠?

如何阻止Express为URL路由添加末尾斜杠?

我太懂你这种困扰了——当路由和项目里的同名目录撞车时,Express会自动把localhost/foo重定向到localhost/foo/,虽然页面能正常加载,但CSS、JS、图片这些资源的路径全被自动加上了foo前缀,折腾base路径总觉得是治标不治本,肯定想从服务端彻底解决对吧?

其实这个问题的根源是Express的express.static中间件:当它检测到请求的路径对应一个实际存在的目录时,就会自动触发301重定向,给URL加上末尾斜杠,哪怕你已经提前定义了同名路由。这里给你两个靠谱的服务端解决方案:

方案一:调整路由与静态中间件的注册顺序

Express是按照中间件/路由的注册顺序来处理请求的,只要把你的自定义路由放在express.static前面注册,请求就会先被你的路由处理,不会走到静态目录的判断逻辑里。比如修改你的server.js:

// 先定义你的路由(注意修正了代码里的"ouput"拼写错误,应该是"output")
app.get("/output", (request, response) => {
  const url = "output.html";
  const options = { root: "absolute/path/to/myproject/public" };
  response.sendFile(url, options);
});

// 再注册静态资源中间件
app.use(express.static("public"));

方案二:禁用静态中间件的自动重定向功能

给express.static传入redirect: false选项,直接关闭它检测到目录时的重定向行为,这样即使存在同名目录,访问localhost/output也不会被强制加斜杠了:

app.use(express.static("public", { redirect: false }));

如果用这个方案,建议你把路由改成兼容带斜杠和不带斜杠的请求,避免用户手动输入带斜杠的URL时出现404,比如:

app.get("/output/?", (request, response) => {
  const url = "output.html";
  const options = { root: "absolute/path/to/myproject/public" };
  response.sendFile(url, options);
});

这样不管用户访问/output还是/output/,都能正常返回页面,同时也不会出现自动重定向加斜杠的问题啦。

备注:内容来源于stack exchange,提问作者1.21 gigawatts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:03:13