为何要搞个防盗链,难道怕自行车被偷吗?如今都共享了,还担忧什么呢!html
防盗链,就是防你盗用个人连接。你在你的网站上引用了个人资源(图片,音频),你跑起来却是没什么事,可是会浪费个人流量,资源被引用的多了起来,我这边的服务器可能就扛不住挂了,你说这是多么悲哀的事情!windows
通常状况下以图片防盗链居多,咱们也来看看图片防盗链是如何作出来的bash
先来看个图,这个图是我在本地启了一个服务后,分别加载了百度和360搜索两个网站的图片连接,对应防盗链下的样子(说好的美少女呢) 服务器
这就是所谓的图片防盗链了,毕竟看到这样的图,你们也没了兴致,和以前想要的图片差距太大,也就不必再保留了网站
那么关键部分来了,图片防盗链是如何作到的呢?且看下图 ui
下面咱们就直接来实践一下,作一个图片防盗链,上菜 url
// js部分
const fs = require('fs');
const path = require('path');
const http = require('http');
const url = require('url');
const getHostName = function (str) {
let { hostname } = url.parse(str);
return hostname;
};
http.createServer((req, res) => {
let refer = req.headers['referer'] || req.headers['referrer']; // 请求头都是小写的
// 先看一下refer的值,去和host的值做对比,不相等就须要防盗链了
// 要读取文件 返回给客户端
let { pathname } = url.parse(req.url);
let src = path.join(__dirname, 'public', '.' + pathname);
// src表明我要找的文件
fs.stat(src, err => { // 先判断文件存不存在
if (!err) {
if (refer) { // 不是全部图片都有来源
let referHost = getHostName(refer);
let host = req.headers['host'].split(':')[0];
if (referHost !== host) {
// 防盗链
fs.createReadStream(path.join(__dirname, 'public', './1.jpg')).pipe(res);
} else {
// 正常显示,若是路径存在,能够正常显示直接返回
fs.createReadStream(src).pipe(res);
}
} else {
// 正常显示,若是路径存在,能够正常显示直接返回
fs.createReadStream(src).pipe(res);
}
} else {
res.end('end');
}
});
}).listen(8888);
复制代码
经过以上不到40行的代码就完成了图片防盗链,想来也并无辣么麻烦,利用请求头来作的事情仍是蛮多的,先来看看防盗链的效果吧spa
<-- html部分 -->
<body>
<img src="http://www.chenhd.me:8888/2.png" />
</body>
复制代码
这里咱们修改一下hosts文件,把127.0.0.1指定为两个不一样的域名访问3d
友情提示:code
因为html部分咱们图片引用的地址就是www.chenhd.me域名下的图片,因此这种状况属于正常访问,直接展现2.png图片了,就是这么酷
好了,今天的分享就到这里了,感谢你们收看了