LAMP架構十三( Apache防盜鏈)
十三、Apache防盜鏈
盜鏈是指在自己的頁面上展示一些並不在自己伺服器上的內容。通常的做法是通過技術手段獲得他人伺服器上的資源地址,繞過別人的資源展示頁面,直接在自己的頁面上向終端使用者提供此內容。比較常見的是一些小站盜用大站的資源(圖片、音樂、視訊),對於這些小站來說,通過盜鏈的方法可以減輕自己伺服器的負擔,因為真實的空間和流量均是來自別人的伺服器。對大站造成的影響確實增加了伺服器壓力,使用者還不是自己的。
防盜鏈就是防止這種行為的產生,實施防盜鏈系統後,因為遮蔽了那些盜鏈的間接資源請求,從而可以大大減輕伺服器及頻寬的壓力,也正如此,越來越多的站點都開始實施防盜鏈技術。
防盜鏈配置(兩種方法)
方法一、Apache防盜鏈的第一種實現方法,可以用rewrite實現。
(1)首先要確認Apache的rewrite module可用:
[[email protected] ~]# httpd -M | grep rewrite
rewrite_module (shared)
(2)在Apache主配置檔案中找到對應的位置(或虛擬主機中),加入下列程式碼:
#防盜鏈配置
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !a\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.a\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ - [F]</IfModule>
(3)重啟Apache服務,並在客戶端上進行訪問驗證:
[[email protected] images]#curl -e "www.qq.com" -x127.0.0.1:8090 a.com/images/test.jpg -I
看出區別了嗎,返回碼200是正常,返回碼403是禁止。
相關選項的解釋
1.RewriteEngine On #啟用rewrite,要想rewrite起作用,必須要寫上
2.RewriteCond test-string condPattern #寫在RewriteRule之前,可以有一或N條,用於測試rewrite的匹配條件。
3.RewriteRule Pattern Substitution #規則
4. %{HTTP_REFERER}:伺服器變數,HTTPReferer是header的一部分,當瀏覽器向web伺服器傳送請求的時候,一般會帶上Referer,告訴伺服器我是從哪個頁面連結過來的,伺服器藉此可以獲得一些資訊用於處理。比如從我主頁上鍊接到一個朋友那裡,他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我主頁上的連結訪問他的網站。
5.[ NC]指的是不區分大小寫, [R]強制重定向redirect
6.字母L表示如果能匹配本條規則,那麼本條規則是最後一條(Last),忽略之後的規則
說明:
1. RewriteCond:表示自己的信任站點。對我的站點來說,設定為 http://www.a.com和 http://a.com
2. RewriteRule:要保護檔案的副檔名(以|分開)。以這些為副檔名的檔案,必須通過RewriteCond的網址引用,才可以訪問。
3. RewriteRule:定義被盜鏈時替代的圖片,讓所有盜鏈 jpg、gif、swf 等檔案的網頁,顯示網頁文件根目錄下的images/ test.png 檔案。注意:替換顯示的圖片不要放在設定防盜鏈的目錄中,並且該圖片檔案體積越小越好。
直接禁用盜鏈:RewriteRule .*\.(gif|jpg|png)$ - [F]
將盜鏈替換成指定圖片 RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]
注:[F] (強制URL為被禁止的forbidden),強制當前URL為被禁止的,即,立即反饋一個HTTP響應程式碼403(被禁止的)。
方法二、通過判斷瀏覽器頭資訊來阻止某些請求,即利用SetEnvIfNoCase和access。這個方法可以通過阻止某些機器人或蜘蛛爬蟲抓取你的網站來節省你的頻寬流量。
SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.a.com/.*$" local_ref
SetEnvIfNoCase Referer "a.com/.*$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|jpeg|png|gif|js|css)">
Order Deny,Allow
Allow from env=local_ref
Deny from all
</filesmatch>
Referer :指明瞭請求當前資源原始資源的URL,使用referer是可以防盜鏈
其實和第一種方式很像,使用SetEnvIfNoCase 匹配某些允許的條件,沒有匹配的就直接拒絕,這裡演示結果就不展現了。