最近作的一個主管安排的項目,給一個系統多增長一套前端模板,這個自己不難,因爲算法那邊不能提供數據,我隨便複製的網上圖片連接,發現有些圖片不能正常顯示,後來知道有些圖片加了「防盜鏈」,這讓我立刻想到了之前遇到的http請求頭中的referer屬性,這個消息頭記錄了本網站的一些資源請求是來自哪一個網站,若是利用這個referer的判斷,就能夠實現過濾。html
代碼:前端
var express = require('express'); var app = express(); var fs = require('fs'); // 設置模板路徑,默認爲./views // app.set('views', path.join('views')); app.engine('html', require('ejs').renderFile); app.set('view engine', 'html'); app.get('/public/*', function (req, res, next) { var referer = req.headers.referer; console.log(referer); if (referer && referer.indexOf('localhost1') <= 0) { try { fs.readFile("./views/no.png", function (err, data) { console.log("no"); res.writeHead(200, {"Content-type": "image/jpg"}); console.log(err); // console.log(data); res.end(data); }); } catch (err) { console.log(err); } } else { try { fs.readFile("./views/a.jpg", function (err, data) { console.log("normal"); res.writeHead(200, {"Content-type": "image/jpg"}); // console.log(data); res.end(data); }); } catch (err) { console.log(err); } } }); app.get('/', function (req, res) { res.render('index', {helloWorld: 'hello,world'}); }); app.listen(3000, function () { console.log('app listen at 3000'); });
referer是一個網站中某個資源的請求才會帶的屬性,若是是直接訪問圖片的這個地址,是不帶referer的,因此
這裏判斷的時候,先要判斷referer存在,再判斷是否是從某域發過來的請求,由於咱們直接訪問地址的時候是想看到圖片結果的,只是一些網站引用咱們的圖片連接時咱們加以屏蔽。算法
還能夠以中間件的形式:express
var express = require('express'); var app = express(); var fs = require('fs'); // 設置模板路徑,默認爲./views // app.set('views', path.join('views')); app.engine('html', require('ejs').renderFile); app.set('view engine', 'html'); function sss (req, res, next) { var referer = req.headers.referer; console.log(referer); // console.log(referer.indexOf('localhost3')); if (referer && referer.indexOf('localhost1') >= 0) { next(); } else { // console.log(res); console.log(1); // res.state(500).send('盜鏈圖片來自:<a href="xxxxx"></a>'); res.send('盜鏈圖片來自:<a href="xxxxx"></a>'); return false; } } app.get('/public/*', sss, function (req,res,next) { console.log(234234); try { fs.readFile("./views/a.jpg", function (err, data) { res.writeHead(200, {"Content-type": "image/jpg"}); console.log(err); // console.log(data); res.end(data); }); }catch (err) { console.log(err); } }); app.get('/', function(req, res) { console.log(10); res.render('index', { helloWorld: 'hello,world' }); }); app.listen(3000, function() { console.log('app listen at 3000'); });
固然破解這種寫法的防盜鏈也很簡單,用中間服務器僞造消息頭就好了。服務器