如何阻止Express渲染static静态目录下的文件?
问题原因
Express 中间件按照注册的先后顺序执行,你当前的express.static('files')静态资源中间件注册在了/files路由定义的前面。当/files请求进来时,静态中间件会优先检索files目录下的匹配资源,一旦检测到你上传的files.html文件存在,就会直接返回该静态文件,不会继续执行后续的路由逻辑。
可用解决方案
- 调整中间件注册顺序:把
/files路由的定义代码挪到express.static('files')注册代码的前面。这样请求会优先匹配业务路由,匹配成功直接渲染pug模板,没有匹配到的请求才会进入静态资源中间件检索返回文件。// 先注册业务路由 router.get('/files', (req, res) => { res.render('files', { someData: goingIn }) }) // 后注册静态资源中间件 router.use(express.static('files')) - 禁用静态中间件的自动索引匹配:如果不想调整顺序,可以给
express.static添加配置项,关闭默认的路径对应html文件匹配逻辑,设置index: false即可禁止静态中间件自动返回对应路径的html文件。router.use(express.static('files', { index: false })) - 更安全的优化方案:给静态资源加专属路径前缀:建议将用户上传的静态资源挂载到独立的路径前缀下,完全避免和业务路由产生路径冲突,同时也能降低恶意文件覆盖路由的安全风险。
// 所有用户上传的文件访问路径都需要加 /upload 前缀,和你的 /files 业务路由完全隔离 router.use('/upload', express.static('files'))
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

