Nginx圖片防盜鏈【實戰】

訪問個人博客html

前言

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

<!--more-->正則表達式

環境準備

這裏我使用兩臺虛擬機 虛擬機的快速安裝能夠參考我另一篇博文 CentOS快速安裝vim

  • 服務器 A:192.168.200.130
  • 服務器 B:192.168.200.131

Nginx 安裝

參考博文 Nginx緩存配置 的 Nginx 環境搭建部分。瀏覽器

Nginx 防盜鏈設置

1、配置 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網站

2、配置 html 文件

1.在 /home 目錄下建立目錄 resources ,在 /home/resources 目錄下放入一張圖片 test.pngurl

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。

資源下載

參考文章

相關文章
相關標籤/搜索