serve-static 缺乏、安全感 2022-09-23 08:41 129阅读 0赞 问题1:serve-static的setHeaders有什么用? **\[javascript\]** [ view plain][view plain] [ copy][view plain] [![在CODE上查看代码片][CODE]][CODE_CODE] [![派生到我的代码片][ico_fork.svg]][ico_fork.svg 1] 1. var express = require('express') 2. var serveStatic = require('serve-static') 3. //这个中间件也可以通过express.static来引入,第二个参数同样表示的是和serve-static同样的选项 4. var app = express() 5. //为一些静态文件设置不同的过期时间,而这个设置通过一个函数也就是setHeaders来完成的 6. //setHeaders用于设定自定义的响应头,函数签名为:fn(res, path, stat)第一个参数表示response对象,第二个表示路径,第三个表示文件的描述符 7. app.use(serveStatic(\_\_dirname + '/public', \{ 8. maxAge: '1d', 9. setHeaders: setCustomCacheControl 10. \})) 11. app.listen(3000) 12. function setCustomCacheControl(res, path) \{ 13. //通过serve-static的mime对象的lookup方法查看文件的mime类型 14. if (serveStatic.mime.lookup(path) === 'text/html') \{ 15. // Custom Cache-Control for HTML files 16. res.setHeader('Cache-Control', 'public, max-age=0') 17. \} 18. \} 注意:通过setHeaders可以指定一个函数,这个函数可以对不同的文件使用不同的缓存策略,这个函数的签名是fn(res, path, stat)。在内部可以通过serve-static的mime对象的lookup来判断文件的mime类型,然后选择不同的缓存策略 问题2:如果为静态文件指定了多个目录那么我们如何设置? **\[javascript\]** [ view plain][view plain] [ copy][view plain] [![在CODE上查看代码片][CODE]][CODE_CODE] [![派生到我的代码片][ico_fork.svg]][ico_fork.svg 1] 1. var express = require('express') 2. var serveStatic = require('serve-static') 3. var app = express() 4. //如果为静态文件指定了多个目录那么我们如何设置 5. app.use(serveStatic(\_\_dirname + '/public-optimized')) 6. app.use(serveStatic(\_\_dirname + '/public')) 7. app.listen(3000) 注意:这时候我们就会首先查找public-optimized目录,然后查找public目录 问题3:默认情况下访问会发送index.html,那么如何取消这种默认行为? **\[javascript\]** [ view plain][view plain] [ copy][view plain] [![在CODE上查看代码片][CODE]][CODE_CODE] [![派生到我的代码片][ico_fork.svg]][ico_fork.svg 1] 1. var express = require('express') 2. var serveStatic = require('serve-static') 3. var app = express() 4. //其中对于index参数来说:如果访问一个目录那么默认会发送index.html,但是我们可以把index设置为false或者我们给这个参数发送一个 5. //数组(或者string),那么就会按照数组指定的顺序进行遍历,前面的优先级高于后者! 6. app.use(serveStatic('public/ftp', \{ 'index': \['default.html', 'default.htm'\]\})) 7. app.listen(3000) 注意:通过制定index参数就可以取消这种默认行为 问题4:如果指定静态文件没有找到,是否可以继续查找其他后缀的文件作为备用文件? **\[javascript\]** [ view plain][view plain] [ copy][view plain] [![在CODE上查看代码片][CODE]][CODE_CODE] [![派生到我的代码片][ico_fork.svg]][ico_fork.svg 1] 1. var express = require('express') 2. var serveStatic = require('serve-static') 3. var app = express() 4. //其中对于index参数来说:如果访问一个目录那么默认会发送index.html,但是我们可以把index设置为false或者我们给这个参数发送一个 5. //数组(或者string),那么就会按照数组指定的顺序进行遍历,前面的优先级高于后者! 6. app.use(serveStatic('public/ftp', \{ 'extensions': \['html', 'htm'\]\})) 7. app.listen(3000) Extensions如果指定了true,那么指定的文件如果没有被找到,那么就会把指定的数组中的后缀添加进去继续查找,然后返回。如:\['html', 'htm'\],默认是false。如果我如下指定了静态文件的目录: **\[javascript\]** [ view plain][view plain] [ copy][view plain] [![在CODE上查看代码片][CODE]][CODE_CODE] [![派生到我的代码片][ico_fork.svg]][ico_fork.svg 1] 1. app.use(express.static(path.join(\_\_dirname, 'public'))); 那么如果在静态文件中有这样的引用: **\[html\]** [ view plain][view plain] [ copy][view plain] [![在CODE上查看代码片][CODE]][CODE_CODE] [![派生到我的代码片][ico_fork.svg]][ico_fork.svg 1] 1. <link rel="stylesheet" href="/stylesheets/style.css"> 那么就会查找public/stylesheets/style.css来获取文件。extensions我觉得可以用于如果没有找到jpg图片继续查找png图片的情况下,如\['jpg','png'\] 问题5:fallthrough参数有什么用? 让有客户端错误的请求通过就像没有这个请求一样,或者也可以产生一个客户端的错误。如果把这个参数设置为true那么那些无效的客户端请求或者404请求就会简单的调用next()来触发下一个中间件,如果设置为false那么就会触发next(err)把错误消息传递给下一个中间件。一般情况下都是true,这时候我们可以把多个物理路径映射到 [相同的URL][URL],当前面一个路径查询不到资源继续转换到下一个物理路径查找(这里是静态资源的查找)。如果你确定你只有一个路径来存放物理资源那么设置为false。这个中间件会处理所有的GET/POST/DELETE等请求,默认情况下为 [true][]! [view plain]: http://blog.csdn.net/liangklfang/article/details/51049031# [CODE]: https://code.csdn.net/assets/CODE_ico.png [CODE_CODE]: https://code.csdn.net/snippets/1633024 [ico_fork.svg]: https://code.csdn.net/assets/ico_fork.svg [ico_fork.svg 1]: https://code.csdn.net/snippets/1633024/fork [URL]: http://expressjs.com/en/starter/static-files.html [true]: https://github.com/expressjs/serve-static?_ga=1.1179825.1201680737.1446005628
还没有评论,来说两句吧...