[TOC]
## referer是什么
下圖直觀感受,(づ ̄ 3 ̄)づ


直接在瀏覽器中輸入url地址來**直接訪問**圖片/js/css等資源時是沒有referer的,
如果有referer說明是引用過來的,要么是從HTML頁面,要么是通過css @import,再或則通過background(url)引用。
## 獲取reffer
```
console.log(req.headers['referer']); //必須小寫
```
### 注意事項
- 關鍵字必須小寫
- 舊瀏覽器中關鍵字為`refer`而不是`referer`
## 應用:reffer防盜鏈
### 設計思路
我們能通過對比`req.headers['referer']`和`req.url`中的localhost來確認資源請求是否是別的站點發來的。
接著知道了資源請求的來源,我們就能通過一系列手段來決定是否響應請求以及怎樣響應。
通常的做法是設置一個白名單,在白名單內的請求我們就響應,否則就不響應。
### 源碼
```
let http = require('http');
let fs = require('fs');
let url = require('url');
let path = require('path');
const whiteList = [
'localhost:8080'
// ,'192.168.0.22'
];
let server = http.createServer(function(req,res){
let refer = req.headers['referer']||req.headers['refer'];
if(refer){
let referHostName = url.parse(refer,true).host;
let currentHostName = url.parse(req.url,true).host;
if(referHostName != currentHostName && whiteList.indexOf(referHostName) == -1){
res.setHeader('Content-Type','text/html;charset=utf-8');
res.end('你娃娃居然盜鏈!'); //因為是圖片資源請求,這里這樣返回文字是無效的
return ;
}
}
res.setHeader('Content-Type','image/png');
fs.createReadStream(path.join(__dirname,'2.jpg')).pipe(res);
}).listen(9999);
```
>[info] Tip: indexOf是字符串和數組中的方法,arr/string.indexOf,so雖然是of但其實是范圍在前。