一个懒癌患者的自言自语



防盗链原理和设置

页面在引入图片、JS 等资源,或者从一个页面跳到另一个页面,都会产生新的 HTTP 请求,浏览器一般都会给这些请求头加上表示来源的 Referrer 字段,服务器通过检测 Referer 是否来自规定域名,来进行防盗链。

设置防盗链方法

1.通过代码方式,以php为例:

$referer = $_SERVER['HTTP_REFERER']; //HTTP Referer是header的一部分
$selfurl = $_SERVER['HTTP_HOST'];//通过$_SERVER['HTTP_HOST']获得URL中网站的域名。 
if(false == strpos($referer,$selfurl)) 

  die('非法来源!');
}

2.通过服务器设置,以nginx为例:

location ~* \.(gif|jpg|png|bmp)$ {
    valid_referers none blocked
*.test.com abc.edd.com server_names ~\.google\. ~\.baidu\.;
   
if ($invalid_referer) {
       
return 403;
        #rewrite
^/ http://www.ttlsa.com/403.jpg;
    }
}

参数解释:

none:“Referer” 来源头部为空的情况

blocked:“Referer”来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头。可根据此设置允许通过的域名

server_names:“Referer”来源头部包含当前的server_names(当前域名)

$invalid_referer变量​:valid_referers列表中没有包含Referer头的值,$invalid_referer将被设置为1,反之匹配上了设置为0

 

​3.nodejs express模块防盗链

var express = require('express'),
  path
= require('path'),
  app
= express();
var AntiLeech = require('express-anti-leech');
// 允许引用的域名白名单
var hosts = ['localhost', 'localhost:8004'];
// 反盗链类型
var exts = ['.png', '.jpg', '.jpeg', '.gif', '.swf', '.flv'];
// 盗链默认指向图片
var pictrue = "/images/default.png";
app.use(AntiLeech({
  allow: hosts,
  exts: exts,
  log: console.log, // 日志记录
  default: pictrue
}));
// 在调用静态资源之前先使用反盗链模块
app.use(express.static(path.join(__dirname, 'public')));
app.set(
'port', process.env.PORT || 8004);
app.get('/', function(req, res) {
  res.redirect(
"/index.html");
});
app.listen(app.get('port'), function() {
  console.log(
"Express test server listening on http://localhost:" + app.get('port'));
});

About ME

about me

kevin

一个在it道路上蹒跚学步的人

心有多大,舞台就有多大,一直奔跑在自己的路上!

Contact ME