在我們的服務器對抗壓力的時候,我們一般控制的圖片被別人的網址預覽的我們的圖片(盜鏈),消耗我們的服務器的資源。
一. 防盜鏈原理
http 協議中,如果從一個網頁跳到另一個網頁,http 頭字段裏面會帶個 Referer。圖片服務器通過檢測 Referer 是否來自規定域名,來進行防盜鏈。
二、設置突破防盜鏈方法
apache環境下
方法1. 使用apache文件FileMatch限制,在httpd.conf中增加 ( 其實也可以將把下面的語句存成一個.htaccess文件),並放到你的網站的根目錄(就是www/html目錄),這樣子別人就沒有辦法盜連你的東東了~~
SetEnvIfNoCase Referer "^http://kuaishou.com/" local_ref=1
Order Allow,Deny
Allow from env=local_ref
Allow from 127.0.0.1
方法2. nginx防盜鏈
一般,我們做好防盜鏈之後其他網站盜鏈的本站圖片就會全部失效無法顯示,但是您如果通過瀏覽器直接輸入圖片地址,仍然會顯示圖片,仍然可以右鍵圖片另存爲下載文件!依然可以下載?這樣就不是徹底的防盜鏈了!
[root@web01 vhosts]# cat default.conf
server {
listen 80 default_server;
server_name 192.168.1.24 web01.espressos.cn *.qq.com *.baidu.com;
root /app/www;
index index.php index.html index.htm;
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked *.espressos.cn;
if ($invalid_referer) {
rewrite ^/ http://192.168.1.25/404.jpg;
#return 404;
}
}
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
access_log /app/log/nginx/access/default.log;
}
注意第8行 “valid_referers none blocked" 其中"none" "blocked" 的意思分別是:
none代表沒有referer;blocded代表有referer但是被防火牆或者是代理給去除了。
注意:
首先當我輸入我要打開的網址的時候,因爲是直接輸入的沒有referer所以匹配了 valid_referers後面的none或者是blocked 所以invalid_referer值爲0 所以不進行跳轉. 當我是從這個網站裏面的鏈接跳到該網站首頁的時候 因爲referer的值是肯定包含srever_names 所以匹配了server_names所以不進行跳轉。 當我從搜素引擎進去的時候因爲referer字段類似於www.google.com.hk/search 開始進行匹配 發現沒有一個匹配,則此時會設置invalid_referer值爲1 if語句成功執行,進行了跳轉. 達到功能
如果把這兩個(none,blocked)去掉就可以真正的實現防盜連了!因爲只有匹配到server_name的時候,纔不會進行跳轉。如下面實例:
<html>
<body>
<h1>hello world bass!! </h1>
<img alt="bass.png" src="/bass.png" height="auto" width="auto"></img>
</body>
</html>
優化:
[root@web01 www]# cat /app/server/nginx/conf/vhosts/default.conf
server {
listen 80 default_server;
server_name 192.168.1.24 web01.espressos.cn *.qq.com *.baidu.com;
root /app/www;
index index.php index.html index.htm;
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers *.espressos.cn;
if ($invalid_referer) {
rewrite ^/ http://192.168.1.25/404.jpg;
#return 404;
}
}
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
access_log /app/log/nginx/access/default.log;
}
注意第8號:8 valid_referers *.espressos.cn;去掉了none,blocked:
這才實現了完美的防盜鏈!!
請確保server段中只有一個location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$,否則可能導致代碼無效,如有這個代碼段請合併或刪除。 切記:如果要跳轉到圖片,記得替換的圖片地址要使用沒有防盜鏈的網站圖片,否則由於替換的圖片其實也處於防盜鏈情況下,會造成仍舊無法顯示設置的圖片。
方法3. 通過php直接獲取資源,在php中進行攔截
$referer = $_SERVER['HTTP_REFERER']; //HTTP Referer是header的一部分,當瀏覽器向web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器基此可以獲得一些信息用於處理。
$selfurl = $_SERVER['HTTP_HOST'];//在php中,我們一般通過$_SERVER['HTTP_HOST']來活得URL中網站的域名或者ip地址。
if(false == strpos($referer,$selfurl))
{
echo '非法盜鏈!';
exit(1);
}