原理
- 前后端网站部署在同一个服务器: 根据请求的网站的主机信息和本网站的主机信息进行对比,如果相等,则进行处理
- 前后端网站部署在不同的服务器: 维护一个主机名的白名单
封装防盗链的中间件
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'));