Nginx 防止網站圖片盜連設定,置換成廣告圖

這裡介紹如何設定 nginx 網頁伺服器,防止其他網站盜連自己網站的圖片,或將圖片自動更換為廣告圖。

自己架設網站的人,都會注意自己伺服器與網站的狀況,若偶爾出現幾則文章的引用,對網站的影響不大,通常一般的站長可能看過就算了,不過如果把好幾篇文章以 html 碼全文貼過去,連圖片網址都懶得改的話,這樣該網頁在載入圖檔時,還是會使用到我們自己伺服器的流量,如果流量大的時候對於伺服器還是會有一些影響的。


如果想要避免其他網站盜連自己伺服器上的圖片,其實作法很簡單,只要修改幾行設定就可以解決這個問題。以下我以 nginx 網頁伺服器為例,示範圖片盜連問題的解決方法。

阻擋網頁圖片盜連

開啟 nginx 網站的設定檔,針對圖片的檔案進行 referer 的檢查,對於不符合的 referer 來源,則傳回 HTTP 的 403 狀態碼:

location ~* \.(gif|jpe?g|png|bmp)$ {
  valid_referers none blocked server_names *.gtwang.org ~\.google\. ~\.baidu\. ~\.bing\. ~\.yahoo\.;
  if ($invalid_referer) {
    return 403;
  }
}

valid_referers 是用來設定那一些是屬於合格的 referer 來源,設定方式如下:

關鍵字 說明
none 允許 request header 中沒有包含 referer 的情況。
blocked 允許 request header 中有包含 referer,不過其內容已經被 proxy 或防火牆修改過,不是 http://https:// 開頭的網址。
server_names 手動指定允許的 referer 網址。

這裡我們除了允許 gtwang.org 網域的 referer 之外,同時也開放 Google、百度、Bing 與 Yahoo 這些搜尋引擎,而除了這些網站之外,其他的網站就不允許直接連結我們伺服器的圖片。

經過這樣的設定之後,其他網站在盜連圖片時,所有的圖片就會變成無法顯示,基本上來說這樣的設定可以有效降低伺服器的負載。

nginx-image-hotlink-protection-using-rewrite-20161107-3

盜圖網站

置換盜連的圖片

防止圖片盜連除了直接將圖片的 request 擋掉之外,還有另外一種作法就是將所有不合格的圖片直接替換成一張網站廣告圖,例如這樣的小圖片:

gtwang-url-128

G. T. Wang 網站廣告圖

將圖片準備好並放上伺服器之後,接著就可以將不合格的圖片連線置換成這張圖,置換圖片的方式就是將原本傳回 HTTP 403 的地方,改為 rewrite 轉址設定:

location ~* \.(gif|jpe?g|png|bmp)$ {
  valid_referers none blocked server_names *.gtwang.org ~\.facebook\. ~\.google\. ~\.baidu\. ~\.bing\. ~\.yahoo\.;
  if ($invalid_referer) {
    # 重新導向至網站廣告圖
    rewrite ^/ /gtwang-url-128.png redirect;
  }
}
# 避免重新導向迴圈
location = /gtwang-url-128.png { }

由於重新導向之後圖檔的 referer 還是一樣沒有改變,為了避免重新導向的無窮迴圈,要再針對這個廣告圖的網址加上一行空的設定,讓它不受到 referer 的設定影響,這樣就完成了。

經過了置換圖檔的設定,其他網站的所有盜連圖片就會直接變成我們設定的廣告圖,而我們自己的網站以及各大搜尋引擎則不會受影響。

nginx-image-hotlink-protection-using-rewrite-20161107-1

盜圖網站

這種透過 nginx 來設定的好處就是不管盜連圖片的數量有多少、圖片網址為何,一次設定之後都可以馬上生效,一勞永逸。

nginx-image-hotlink-protection-using-rewrite-20161107-2

盜圖網站

參考網站:nikhil’s blogdngood

Linux

1 Comment

  1. E. WU

    一改完連我自己的網站都不能用了

    已經把 *.gtwang.org 的網站改成自己的

Leave a Reply