如何阻止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
相关产品推荐
相关产品推荐

