1. 程式人生 > >Nginx圖片防盜鏈【實戰】

Nginx圖片防盜鏈【實戰】

.com 網站 onf html 之前 直接 ctrl+ int 火墻

訪問我的博客

前言

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

環境準備

這裏我使用兩臺虛擬機 虛擬機的快速安裝可以參考我另外一篇博文 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,圖片正常加載

技術分享圖片

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

技術分享圖片

技術分享圖片

技術分享圖片

  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 的圖片

技術分享圖片

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

valid_referers none server_names *.test1.com;

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

技術分享圖片

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

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

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

資源下載

  • 文章涉及配置文件下載

參考文章

  • http://www.cnblogs.com/kevingrace/p/6168992.html

Nginx圖片防盜鏈【實戰】