Express使用通配符无法路由到404页面的问题求助
解决Express中无效URL无法触发404的问题
你的问题核心在于index-routes.js里的router.get('/*')路由——它会匹配所有GET请求,不管这个URL是否存在,所以后面的404处理中间件根本没机会执行。下面给你两种可行的解决思路:
思路1:缩小路由匹配范围(推荐,适合SPA应用)
如果你的应用是单页应用(SPA),只需要服务器渲染根路径/,其他路由由前端框架(比如React Router、Vue Router)处理,那直接把通配符路由改成只匹配根路径:
修改index-routes.js:
//Base routes router.get('/', async (req, res, next) => { const data = { title: 'MyApplication', appVersion: req.appVersion || '', name: secure.session.name || '', email: secure.session.email || '', userId: '', module: secure.session.homeModule, appPath: secure.session.homeModuleUrl, sessionAge: env.sessionAge, isDev: env.isDevelopment, uiAppUrl: env.uiAppUrl, appUrl : env.appUrl, froalaKey: env.froalaKey, pusherKey: env.pusherKey, pusherCluster: env.pusherCluster, nonce: res.locals.nonce, }; if (req.path === '/') { const account = new Account(req.db); const user_settings = await account.getUserSettings( new ObjectId(session.userId) ); data.homeUrl = user_settings.homeUrl || '/dashboard'; } res.render('index', data); }); // 如果有其他需要服务器端渲染的路径,单独添加路由,不要用通配符 // 示例:router.get('/about', (req, res) => { res.render('about'); });
这样只有访问根路径/时才会走这个路由,其他不存在的GET请求会落到后面的app.all('*')404处理逻辑里。
思路2:在通配符路由中校验有效路径
如果必须保留通配符路由(比如服务器端需要处理多个动态路径),可以先定义所有有效的路径集合,在路由里判断当前请求路径是否合法,不合法就交给下一个中间件(404)处理:
修改index-routes.js:
//Base routes // 先定义所有有效的服务器端路径 const validServerPaths = ['/', '/dashboard', '/profile', '/settings']; // 根据你的实际业务补充 router.get('/*', async (req, res, next) => { // 检查当前路径是否在有效列表中,不在就直接走404 if (!validServerPaths.includes(req.path)) { return next(); } const data = { title: 'MyApplication', appVersion: req.appVersion || '', name: secure.session.name || '', email: secure.session.email || '', userId: '', module: secure.session.homeModule, appPath: secure.session.homeModuleUrl, sessionAge: env.sessionAge, isDev: env.isDevelopment, uiAppUrl: env.uiAppUrl, appUrl : env.appUrl, froalaKey: env.froalaKey, pusherKey: env.pusherKey, pusherCluster: env.pusherCluster, nonce: res.locals.nonce, }; if (req.path === '/') { const account = new Account(req.db); const user_settings = await account.getUserSettings( new ObjectId(session.userId) ); data.homeUrl = user_settings.homeUrl || '/dashboard'; } res.render('index', data); });
额外注意
你提到输入无效URL会跳转到/dashboard,还要检查一下前端路由配置——如果前端框架里设置了"路径不存在时重定向到/dashboard",那即使服务器返回404,前端也会自己跳转。这种情况下需要调整前端路由,添加一个404页面的路由规则。
内容的提问来源于stack exchange,提问作者Sohan
相关产品推荐
相关产品推荐

