原理

  1. 前后端网站部署在同一个服务器: 根据请求的网站的主机信息和本网站的主机信息进行对比,如果相等,则进行处理
  2. 前后端网站部署在不同的服务器: 维护一个主机名的白名单

封装防盗链的中间件

  1. const url = require('url');
  2. const path = require('path')
  3. module.exports = function (req, res, next) {
  4. const host = req.headers.host; // 获取本网站的主机名
  5. let referer = req.headers.referer;
  6. // 只处理图片
  7. const extnname = path.extname(req.path);
  8. if (!['.jpg', '.jpeg', '.png', '.gif'].includes(extnname)) {
  9. next();
  10. return;
  11. }
  12. if (referer) {
  13. referer = url.parse(referer).host;
  14. }
  15. if (referer && host !== referer) {
  16. req.url = '/img/protect_img.jpeg'; // url rewrite
  17. }
  18. next();
  19. }

此处,只给图片做了防盗链,也可以给js,css做同样的防盗链

这段代码,是给非法的请求,返回了一张默认的图片

  1. if (referer && host !== referer) {
  2. req.url = '/img/protect_img.jpeg'; // url rewrite
  3. }

引入中间件

  1. app.use(require('./middlewares/imgProtected'));