一、利用valid_referers指令防盜鏈:
HTTP Referer是Header的一部分,當瀏覽器向Web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器藉此可以獲得一些信息用於處理,
例如防止未經允許的網站盜鏈圖片、文件等。因此HTTP Referer頭信息是可以通過程序來僞裝生成的,所以通過Referer信息防盜鏈並非100%可靠,但是,它能夠限制大部分的盜鏈
情況。
該指令"valid_referers"的語法:
valid_referers [none|blocked|server_names] ...
默認值:none
使用環境:server,location
該指令會根據Referer Header頭的內容分配一個值爲0或1給變量$invalid_referer。如果Referer Header頭不符合valid_referers指令設置的有效Referer,變量$invalid_referer
將被設置爲1.
該指令的參數可以爲下面的內容:
none:表示無Referer值的情況。
blocked:表示Referer值被防火牆進行僞裝。
server_names:表示一個或多個主機名稱。從Nginx 0.5.33版本開始,server_names中可以使用通配符"*"號。
二、配置處理:
所用到的機器:
192.168.100.100 nginx
自己的pc機 xp
測試一、我打算用個rewrite來匹配相應的url。
nginx的配置如下:
server { listen 80; server_name haha.baidu.com; root /data/www/haha; location /FF/ { valid_referers www.baidu.com; if ($invalid_referer) { return 403; } } } server { listen 80; server_name hehe.baidu.com; root /data1/web/hehe/FF/F4; rewrite /hehe.html http://haha.baidu.com/FF/F4/haha.html; }
log如下所示:
IP - - [07/Mar/2012:09:32:00 +0800] "GET /hehe.html HTTP/1.1" 302 161 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"
"hehe.baidu.com" "-"
IP - - [07/Mar/2012:09:32:00 +0800] "GET /FF/F4/haha.html HTTP/1.1" 403 142 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"
"haha.baidu.com" "-"
測試:在瀏覽器中輸入http://hehe.baidu.com/hehe.html,瀏覽器其實403錯誤。
把 valid_referers www.baidu.com;中的www換成hehe,發現返回的也是403
log如下所示:
IP - - [07/Mar/2012:09:33:22 +0800] "GET /hehe.html HTTP/1.1" 302 161 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2"
"-" "hehe.baidu.com" "-"
IP- - [07/Mar/2012:09:33:22 +0800] "GET /FF/F4/haha.html HTTP/1.1" 403 142 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101
Firefox/10.0.2" "-" "haha.baidu.com" "-"
發現"$http_referer"的值爲"-"也就是空。
總結:上面的問題是發現"$http_referer"的值爲"-"也就是空,沒有滿足匹配的條件。如果我們加上none參數的話就可以了,我們讓none也就是$http_referer"的值爲"-"爲有效值(已經測試)
。
測試二:
爲了讓"$http_referer"能拿到以server_name爲hehe.baidu.com,我編輯了一下hehe.html,具體的內容如下所示:
html>
location /FF/ {
valid_referers none blocked www.baidu.com;
if ($invalid_referer) {
return 403;
}
}
}
server {
listen 80;
server_name hehe.baidu.com;
root /data/www/hehe/FF/F4;
}
對應的log:如下所示:
IP - - [06/Mar/2012:17:24:37 +0800] "GET /hehe.html HTTP/1.1" 200 99 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"
"hehe.baidu.com" "-"
IP - - [06/Mar/2012:17:24:39 +0800] "GET /FF/F4/haha.html HTTP/1.1" 200 5 "http://hehe.baidu.com/hehe.html" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2)
Gecko/20100101 Firefox/10.0.2" "-" "haha.baidu.com" "-"
測試:http://hehe.baidu.com/hehe.html,接着再點擊hehe,之後發現是403.
把www換成hehe。
接着測試:輸入http://hehe.baidu.com/hehe.html,接着再點擊hehe,之後發現是正常的內容。