Nginx圖片防盜鏈【實戰】


訪問我的博客

前言

博主目前在一家原創小說網站公司工作,由於站內的作品全部是原創,於是乎不可避免地會被一些盜版網站爬取盜版,對於防盜版一直沒有很好的對策,讓公司很是苦惱。
最近去一些盜版網站上搜索我們網站作品時,發現他們所用的封面圖片的來源是我們網站的地址,即所謂的盜鏈,這對於我們網站服務器的帶寬是一種損失,因此需要采取對應的手段應對。

環境准備

這里我使用兩台虛擬機 虛擬機的快速安裝可以參考我另外一篇博文 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_nameslocation 的父節點 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 的配置

  1. 服務器 B 和 服務器 A一樣安裝好 nginx
  2. 修改 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;
    }
}
  1. 修改服務器 B Nginx 安裝目錄下 html 目錄中的 index.html 文件,同樣添加 img 標簽。
<img src="http://www.vcmq.com/test.png" />
  1. 啟動 服務器 B 的 Nginx

配置注意事項

  1. 配置資源的 location 需要在 location / 之前。
  2. 如果在 location 或者其父節點 server 中沒有配置 root 的值, 當請求時合法的時候,會 404 找不到資源文件,因此需要在 location 或者 server 節點設置 root 的值
  3. 注意調試的時候,務必使用 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
  1. 瀏覽器訪問 www.vcmq.com,圖片正常加載

mark

  1. 瀏覽器訪問 www.test1.comwww.test2.com 還有直接訪問圖片 http://www.vcmq.com/test.png 都正常加載

mark

mark

mark

  1. 修改 服務器 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.comwww.test1.comwww.test2.comhttp://www.vcmq.com/test.png

發現只有 www.vcmq.comhttp://www.vcmq.com/test.png 正常顯示,其他請求皆返回 rewrite 的圖片

mark

同理再次修改 nginx.conf 文件, 允許來自 test1 的訪問請求

valid_referers none server_names *.test1.com;

結果發現
www.test1.com可以獲取正常圖片,而www.test2.com還是 rewrite 之后的圖片

mark

至此,已經實現了基於 Nginx 的簡單圖片防盜鏈。

實際應用中,可以設置允許來自公司下的域名與空 refer 的請求通過。

這里允許 空 refer 的請求通過的原因是,有些合法的請求可能會沒有帶上 refer。

資源下載

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM