原理
- 前后端网站部署在同一个服务器: 根据请求的网站的主机信息和本网站的主机信息进行对比,如果相等,则进行处理
- 前后端网站部署在不同的服务器: 维护一个主机名的白名单
封装防盗链的中间件
const url = require('url');const path = require('path')module.exports = function (req, res, next) {const host = req.headers.host; // 获取本网站的主机名let referer = req.headers.referer;// 只处理图片const extnname = path.extname(req.path);if (!['.jpg', '.jpeg', '.png', '.gif'].includes(extnname)) {next();return;}if (referer) {referer = url.parse(referer).host;}if (referer && host !== referer) {req.url = '/img/protect_img.jpeg'; // url rewrite}next();}
此处,只给图片做了防盗链,也可以给js,css做同样的防盗链
这段代码,是给非法的请求,返回了一张默认的图片
if (referer && host !== referer) {req.url = '/img/protect_img.jpeg'; // url rewrite}
引入中间件
app.use(require('./middlewares/imgProtected'));
