前言
博主目前在一家原創小說網站公司工作,由於站內的作品全部是原創,於是乎不可避免地會被一些盜版網站爬取盜版,對於防盜版一直沒有很好的對策,讓公司很是苦惱。
最近去一些盜版網站上搜索我們網站作品時,發現他們所用的封面圖片的來源是我們網站的地址,即所謂的盜鏈,這對於我們網站服務器的帶寬是一種損失,因此需要采取對應的手段應對。
環境准備
這里我使用兩台虛擬機 虛擬機的快速安裝可以參考我另外一篇博文 CentOS快速安裝
- 服務器 A:192.168.200.130
- 服務器 B:192.168.200.131
Nginx 安裝
參考博文 Nginx緩存配置 的 Nginx 環境搭建部分。
Nginx 防盜鏈設置
一、配置 Nginx 的防盜鏈
# 修改 nginx.conf 配置文件
vim /usr/local/nginx/conf/nginx.conf
# 添加 server 節點
server {
listen 80;
server_name www.vcmq.com;
#access_log logs/host.access.log main;
location ~* \.(jpg|png|gif)$ {
root /home/resources;
valid_referers none server_names *.test1.com ~\.test2\.;
if ($invalid_referer){
rewrite ^/ http://ojt4b2cr5.bkt.clouddn.com/blog/20171028/214345352.png;
}
}
location / {
root html;
index index.html index.htm;
}
}
可以看到,我新增的 server 的地址是 www.vcmq.com。
location ~* \.(jpg|png|gif)$
此行配置的作用是匹配以 jpg/png/gif 結尾的文件請求, 如果匹配就執行 括號內的代碼。
valid_referers none server_names *.test1.com ~\.test2\.;
if ($invalid_referer){
rewrite ^/ http://ojt4b2cr5.bkt.clouddn.com/blog/20171028/214345352.png;
}
首先看第一行,這行的作用是配置可以識別 refer,即可以正常獲取資源文件的請求,在這里配置加入白名單的請求 refer 域名。
參數說明:
- none 代表請求的 refer 為空,也就是直接訪問,比如在瀏覽器中直接訪問圖片
www.vcmq.com/test1.png
,直接訪問時,refer 會為空。 - blocked refer 來源不為空,但是里面的值被代理或者防火牆刪除了
- server_names refer 來源包含當前的
server_names
即location
的父節點server
節點的server_name
的值。 - 字符串 定義服務器名稱,比如
*.test1.com
,配置后,來源是從test1.com
就會被認為是合法的請求。 - 正則表達式 匹配合法請求來源, 如
~\.test2\.
當請求的 refer
是合法的,即可以被后面任一參數所匹配, $invalid_referer
的值為0, 若不匹配則值為 1, 進入 if
的代碼中。我這里的設置是,如果是不合法的請求,就統一返回一張圖片,也可以直接返回 403
。
二、配置 html 文件
1.在 /home
目錄下創建目錄 resources
,在 /home/resources
目錄下放入一張圖片 test.png。
2.修改 nginx
安裝目錄下 html
中的 index.html
文件。添加一個 img 標簽,src 訪問上一步中的圖片文件
<img src="http://www.vcmq.com/test.png" />
3.啟動 nginx
/usr/local/nginx/sbin/nginx
4.以上所有配置是對於服務器 A 的配置,以下講解服務器 B 的配置
- 服務器 B 和 服務器 A一樣安裝好 nginx
- 修改 nginx.conf 配置文件, 添加兩個 server
server {
listen 80;
server_name www.test1.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.test2.com;
location / {
root html;
index index.html index.htm;
}
}
- 修改服務器 B Nginx 安裝目錄下 html 目錄中的 index.html 文件,同樣添加 img 標簽。
<img src="http://www.vcmq.com/test.png" />
- 啟動 服務器 B 的 Nginx
配置注意事項
- 配置資源的 location 需要在 location / 之前。
- 如果在 location 或者其父節點 server 中沒有配置 root 的值, 當請求時合法的時候,會 404 找不到資源文件,因此需要在 location 或者 server 節點設置 root 的值
- 注意調試的時候,務必使用 Ctrl + F5 進行刷新網頁,因為 nginx 會緩存圖片!
測試
我上面配置的 server_name 配置的域名是 www.vcmq.com ,因此測試時,需要將我電腦的 host 指向虛擬機的 ip, 可以使用 SwitchHosts 來便捷切換。
# 指向服務器A
192.168.200.130 www.vcmq.com
# 指向服務器B
192.168.200.131 www.test1.com www.test2.com
- 瀏覽器訪問 www.vcmq.com,圖片正常加載
- 瀏覽器訪問
www.test1.com
與www.test2.com
還有直接訪問圖片http://www.vcmq.com/test.png
都正常加載
- 修改 服務器 A 的 nginx.conf 配置文件
valid_referers none server_names *.test1.com ~\.test2\.;
將此行修改為
valid_referers none server_names;
即只允許當前 server_name 與 無 refer 的請求,其他請求都返回 rewrite 的圖片, 然后重啟 nginx
/usr/local/nginx/sbin/nginx -s reload
再次分別訪問 ,注意需要使用 ctrl+F5 刷新一下緩存
www.vcmq.com
、www.test1.com
、www.test2.com
、http://www.vcmq.com/test.png
。
發現只有 www.vcmq.com
與 http://www.vcmq.com/test.png
正常顯示,其他請求皆返回 rewrite 的圖片
同理再次修改 nginx.conf 文件, 允許來自 test1 的訪問請求
valid_referers none server_names *.test1.com;
結果發現
www.test1.com
可以獲取正常圖片,而www.test2.com
還是 rewrite 之后的圖片
至此,已經實現了基於 Nginx 的簡單圖片防盜鏈。
實際應用中,可以設置允許來自公司下的域名與空 refer 的請求通過。
這里允許 空 refer 的請求通過的原因是,有些合法的請求可能會沒有帶上 refer。