訪問個人博客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_names
即location
的父節點server
節點的server_name
的值。 - 字符串 定義服務器名稱,好比
*.test1.com
,配置後,來源是從test1.com
就會被認爲是合法的請求。 - 正則表達式 匹配合法請求來源, 如
~\.test2\.
當請求的 refer
是合法的,便可以被後面任一參數所匹配, $invalid_referer
的值爲0, 若不匹配則值爲 1, 進入 if
的代碼中。我這裏的設置是,若是是不合法的請求,就統一返回一張圖片,也能夠直接返回 403
。網站
2、配置 html 文件
1.在 /home
目錄下建立目錄 resources
,在 /home/resources
目錄下放入一張圖片 test.png。url
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。